常見內排序 go版本實現

2021-10-12 21:20:09 字數 2995 閱讀 4367

1 選擇排序

表現最穩定的排序演算法之一 ,因為無論什麼資料進去都是o(n2)的時間複雜度,o(1)的空間複雜度 ,所以用到它的時候,資料規模越小越好。唯一的好處可能就是不占用額外的記憶體空間,不穩定

舉個例子:對於2 9 5 4 8 1 6

step1:在列表中先選擇最大元9並與最後乙個數字6交換 2 6 5 4 8 1 9;

step2:在剩餘列表選擇最大元8並與最後乙個數字1交換 2 6 5 4 1 8 9;

step3:在剩下列表選擇最大元6並與最後乙個數字1交換 2 1 5 4 6 8 9;

step4:在剩下列表選擇最大元5並與最後乙個數字4交換 2 1 4 5 6 8 9;

step5:剩下列表最大元4已經在合適位置不用交換;

step6:在剩下列表選擇最大元2並與最後乙個數字1交換 1 2 4 5 6 8 9;

最後只剩乙個數字,無需再排序,排序完成。

演算法時間複雜度分析:第一步迭代需要n-1次比較操作;第二步需要n-2個比較。。。c表示其他常見操作(賦值,每次迭代的比較)

t(n)=n-1+n-2+...+1+c*(n-1)=n^2/2-n/2+c*(n-1)=o(n^2)

func selectionsort(arr int) 

} arr[maxvidx], arr[len(arr)-1-i] = arr[len(arr)-1-i], arr[maxvidx]

}}

2 氣泡排序

分len-1輪比較,每一輪兩兩比較,將最值沉澱。最佳時間複雜度o(n)最差o(n2),空間複雜度o(1),穩定性排序。

例子:2 9 5 4 8 1 6

step1:將2 9交換,因為已經是公升序不用再動;將9 5交換成5 9;將9 4 交換成4 9;將9 8交換成8 9;將9 1交換成1 9;將9 6交換成6 9;----最大元素沉底2 5 4 8 1 6 9;

step2: 類似的將8沉底得到2 4 5 1 6 8 9;

step3:類似的將6沉底得到2 4 5 1 6 8 9;

step4:類似的將5沉底得到2 4 1 5 6 8 9;

step5:類似的將4沉底得到2 1 4 5 6 8 9;

step6:類似的將2沉底得到1 2 4 5 6 8 9;

最後完成

演算法分析:

在最好情況時第一步就發現已經有序,則無需再操作,比較此時n-1,o(n);

最壞情況:總共n-1次掃瞄;第k次掃瞄需要比較n-k次比較

t(n)=1+2+...(n-1)+c*(n-1)=o(n^2);

func bubblesort(arr int) 

} }}

3 插入排序

以原始陣列第乙個元素為有序序列的首個元素,原始陣列後面的元素都與有序序列比較,利用有序性找到該元素在有序序列中的位置然後插入,也即當插入第i(i>1)個元素時,前面的data[0],data[1]……data[i-1]已經排好序。這時用data[i]的排序碼與data[i-1],data[i-2],……的排序碼順序進行比較,找到插入位置即將data[i]插入,原來位置上的元素向後順序移動。最佳時間複雜度o(n)最差o(n2),空間複雜度o(1),穩定性排序。

還是例子2 9 5 4 8 1 6

step1:初始時,已排序列表只含列表第乙個元素。將9插入:2 9;

step2:已經排序的2,9,將接下來的5插入列表:2 5 9;

step3:已經排序的2 5 9 ,將接下來的4插入列表:2 4 5 9;

step4:已經排序的2 4 5 6,將接下來的8插入列表:2 4 5 8 9;

step5:已經排序的2 4 5 8 9,將接下來的1 插入列表:1 2 4 5  8 9;

step6:已經排序的1 2 4 5 8 9,接下來的6插入列表:1 2 4 5 6 8 9.

step:整個排序完成。

演算法效能:第k個迭代,需要將元素插入乙個規模k的有序陣列,需要k次比較k次資料移動,c是其他操作

t(n)=2*(1+2+...+n-1)+c*(n-2)=o(n^2)

func insertsort(arr int) 

arr[j+1] = cur

}}

4 希爾排序

該方法是插入的改進,基本思想是:設待排序元素序列有n個元素,首先取乙個整數increment(小於n)作為間隔將全部元素分為increment個子序列,所有距離為increment的元素放在同乙個子串行中,在每乙個子串行中分別實行直接插入排序。然後縮小間隔increment,重複上述子串行劃分和排序工作。直到最後取increment=1,將所有元素放在同乙個子串行中排序為止。由於開始時,increment的取值較大,每個子串行中的元素較少,排序速度較快,到排序後期increment取值逐漸變小,子串行中元素個數逐漸增多,但由於前面工作的基礎,大多數元素已經基本有序,所以排序速度仍然很快。最佳時間複雜度o(nlogn)最差o(nlogn2),空間複雜度o(1),不穩定性排序。

如陣列[1,0,2,10,9,70,5,6,3],

我們先選擇增量 length/2,如上9/2=4,分為4組,分別是【1,9】,【0,70】,【2,5】,【10,6】加上剩下的一組

然後給每個陣列進行排序,得到[1,0,2,6,9,70,5,10,3]

然後再選擇增量length/2/2,如上9/2/2=2,分為2組,分別是【1,0,2,6】,【9,70,5,10】,加上剩下的一組

然後給每個陣列進行排序,得到[0,1,2,6,5,9,10,70,3]

然後再選擇增量length/2/2/2,如上9/2/2/2=1,分為1組,為[0,1,2,6,5,9,10,70,3]

然後排序,得到[0 1 2 3 5 6 9 10 70]

func shellsort(arr int) 

arr[j+deltadis] = cur

} }}

Go語言實現 常見排序演算法

氣泡排序 時間複雜度 o n 2 穩定性 穩定 氣泡排序 相鄰兩位交換,12交換,23交換,34交換,把最大的數放到最右邊 利用flag標記可以避免無效迴圈 func bubblesort arr int true表示序列已經有序,直接退出,不用繼續迴圈 false表示本次迴圈發生了交換,需要繼續判...

Go語言實現 常見排序演算法

氣泡排序 時間複雜度 o n 2 穩定性 穩定 氣泡排序 相鄰兩位交換,12交換,23交換,34交換,把最大的數放到最右邊 利用flag標記可以避免無效迴圈 func bubblesort arr int true表示序列已經有序,直接退出,不用繼續迴圈 false表示本次迴圈發生了交換,需要繼續判...

dataTable內實現排序

c code static void useorderbywhere 性別 年齡 item.field string name item.field string xingbie item.field int age 查詢query4查詢資料表中所有年齡大於20小於25的人,並且按照年齡從高到低排序...