基礎演算法排序之增量式排序

2021-06-15 03:41:43 字數 1603 閱讀 1755

寫在之前的話,演算法基礎太差,可能是智商不夠吧,唉那就寫點什麼吧!

1.插入排序

在插入排序過程中,將乙個陣列a看成是兩個部分,第一部分為a[0..j-1],第二個部分為a[j..length-1],而插入排序演算法的過程就是要將第二部分a[j]以及之後的元素插入到第一部分的陣列中,而每一次的插入,a[j]元素都需要與第一部分的每個元素做比較,比較的順序是逆序的,比如a[j]先與a[j-1]比較。這樣就可以邊比較邊將第一部分的陣列元素乙個乙個移動到後面的位置上,然後等到比較的條件滿足了就可以將a[j]元素插入。

例如: 程式初始化時陣列的第一部分預設為a[0],因為a[0]只有乙個元素所以它是理所當然排好序的,下面就是將a[1..length-1]中的a[1]與a[0]比較,如果以遞增的方式排序的話,當滿足a[0]>a[1]的時候就將a[0]移動到a[1]的位置然後將a[1]插入到a[0]的位置,這樣完成後兩個部分分別為a[0..1]和a[1..length-1],並且a[0..1]是以排好序的,如此迭代下去,第一部分就會完成排序了。因為演算法過程中第一部分是從乙個到全部逐漸排好序的,所以可以將它認為是一種增量式排序。

void insert_sort(int a, int length) 

a[i+1] = key;

}}

2.選擇排序

類似於插入排序,選擇排序也是一種增量式排序,也就是說也可以將陣列看成是兩個部分,第一部分始終是排好序的,第二部分是未完成排序的。它們的區別在於,插入排序的第二部分是乙個乙個的往第一部分中插入,比如a[j..length-1],先插a[j]後插a[j+1]一直下去,不同於插入排序,選擇排序並不是乙個乙個按陣列的順序的去插入,而是每次插入的時候是從第二部分中選擇最小的乙個元素再插入到第一部分的最後乙個元素中,第一部分也不需要移動,因為每次搜尋的最小的肯定大於或者等於第一部分的任何元素的。這樣到最後也就可以完成排序了.

可以這樣理解: 打牌的時候,一副撲克牌由多人輪流拿牌,這個時候你需要將自己手中的牌排序的時候,就是插入排序了。但是如果有10張牌,讓你排序,你可以每次選擇一張最小的,然後放到已經排好序的牌後面,最後也可以完成排序了。

void select_sort(int a, int length) 

}a[i] = min;

a[min_index] = temp;

}}

3.氣泡排序

氣泡排序也是一種增量式排序,也就是說在排序過程中可以將陣列看成是兩部分第一部分是排好序的,第二部分是未排序的。類似於選擇排序,排序也是從第二部分選擇最小的元素或者最大的元素,但又不同於選擇排序的是:選擇的方法不一樣,氣泡排序演算法是重複交換第二部分相鄰的反序元素。

例如: 2, 3, 5, 0 以遞增方式排序

程式初始化始第一部分為空第二部分為整個陣列,重複交換相鄰的反序元素,從最後乙個元素開始,

經過0和5交換  2 3 0 5

0和3交換  2 0 3 5

0和2交換  0 2 3 5

經過若干次交換後最小元素0就會排在第乙個元素,如此下去小的元素不斷的新增到第一部分中。

void bubble_sort(int a, int length)       

}}}

希爾排序增量怎麼確定 排序演算法之希爾排序

本文將介紹排序演算法中的希爾排序,它是高階版的插入排序,是我們第乙個介紹的有點難度的演算法。希爾排序,是插入排序的乙個公升級版本。在插入排序中,無論資料是怎麼分布的,依然循規蹈矩的一步一步比較,移動,插入。在希爾排序中,採用跳躍式的方式,按照某個增量gap將陣列元素分成多組序列,並使用插入排序使得各...

排序演算法(四) 希爾排序 增量排序

希爾排序思想 將現有資料分為d個組,在每個分組內使用直接插入排序演算法,使得整個資料段越來越有序。接著繼續將資料分組並使用直接插入排序 分組會越來越小 直到分組為1。每個分組數一般互質 時間複雜度 o n 1.3 1.5 空間複雜度 o 1 穩定性 不穩定 void shell int arr,in...

排序演算法之桶式排序

任何只是用比較的一般 通用排序演算法,最壞時間複雜度都大於等於nlogn 但是,在某些特殊條件限制下,以線性時間排序仍然是可能的 桶式排序,資料必須只有小於m的正整數組成。最壞時間複雜度n m 演算法描述 使用乙個大小為m的count陣列 count有m個桶 初始化為0 掃瞄一遍待排序序列,當讀pd...