排序演算法整理(一)

2021-07-01 21:48:51 字數 3145 閱讀 1071

一、氣泡排序

氣泡排序相對於最簡單的排序有了改進,即每次交換都是對後續有幫助的,大數將會越來越大,小的數將會越來越小;

氣泡排序思想:兩兩相鄰元素之間的比較,

如果前者大於後者,則交換;

因此此排序屬於交換排序一類,同類的還有現在最常用的排序方法:快速排序;

1.標準氣泡排序

此種方法是最一般的氣泡排序實現,思想就是兩兩相鄰比較並交換;

演算法實現如下:

1. public static int bubble_sort2(int arr)  

7. } 

8. } 

9. return arr; 

10. } 

public static int bubble_sort2(int arr)  }

}return arr; }

2.改進氣泡排序

改進在於如果出現乙個序列,此序列基本是排好序的,如果是標準的氣泡排序,則還是需要進行不斷的比較;

改進方法:通過乙個boolean ischanged

,如果一次迴圈中沒有交換過元素,則說明已經排好序;

演算法實現如下:

1. // 最好:

n-1次比較,不移動

,因此時間複雜度為

o(n)

,不占用輔助空間

2. // 最壞:

n(n-1)/2

次比較和移動,因此

o(n^2)

,占用交換的臨時空間,大小為1;

3. public static int bubble_sort3(int arr)  

12. } 

13. } 

14. return arr; 

15. } 

// 最好:n-1次比較,不移動,因此時間複雜度為o(n),不占用輔助空間

// 最壞:n(n-1)/2次比較和移動,因此o(n^2),占用交換的臨時空間,大小為1;

public static int bubble_sort3(int arr)  }

}return arr; }

二、簡單選擇排序

簡單選擇排序特點:每次迴圈找到最小值,並交換,因此交換次數始終為n-1

次;相對於最簡單的排序,對於很多不必要的交換做了改進,每個迴圈不斷比較後記錄最小值,只做了一次交換(當然也可能不交換,當最小值已經在正確位置)

演算法如下:

1. //最差:

n(n-1)/2

次比較,

n-1次交換,因此時間複雜度為

o(n^2)

2. //最好:

n(n-1)/2

次比較,不交換,因此時間複雜度為

o(n^2)

3. //好於氣泡排序

4. public static int selection_sort(int arr)  

11. } 

12. if (min != i) 

13. swap(arr, min, i); 

14. } 

15. return arr; 

16. } 

//最差:n(n-1)/2次比較,n-1次交換,因此時間複雜度為o(n^2)

//最好:n(n-1)/2次比較,不交換,因此時間複雜度為o(n^2)

//好於氣泡排序

public static int selection_sort(int arr)  }

if (min != i)

swap(arr, min, i); }

return arr; }

三、簡單插入排序

思想: 

給定序列,存在乙個分界線,分界線的左邊被認為是有序的,分界線的右邊還沒被排序,每次取沒被排序的最左邊乙個和已排序的做比較,並插入到正確位置;我們預設索引

0的子陣列有序;每次迴圈將分界線右邊的乙個元素插入有序陣列中,並將分界線向右移一位;

演算法如下:

1. // 最好

:n-1

次比較,

0次移動 

,時間複雜度為

o(n)

2. // 最差

:(n+2)(n-1)/2

次比較,

(n+4)(n-1)/2

次移動,時間複雜度為 

o(n^2)

3. public static int insertion_sort(int arr)  

11. arr[j + 1] = tmp; 

12. } 

13. } 

14. return arr; 

15. } 

// 最好:n-1次比較,0次移動 ,時間複雜度為o(n)

// 最差:(n+2)(n-1)/2次比較,(n+4)(n-1)/2次移動,時間複雜度為 o(n^2)

public static int insertion_sort(int arr) 

arr[j + 1] = tmp; }

}return arr; }

簡單插入排序比選擇排序和氣泡排序好!

四、希爾排序

2023年

shell

發明;第乙個突破o(n^2)

的排序演算法;是簡單插入排序的改進版;

思想:由於簡單插入排序對於記錄較少或基本有序時很有效,因此我們可以通過將序列進行分組排序使得每組容量變小,再進行分組排序,然後進行一次簡單插入排序即可;

這裡的分組是跳躍分組,即第1,4,7

位置為一組,第2,

5,8位置為一組,第3,

6,9位置為一組; 索引

1 23 4

5 67 8

9 此時,如果increment=3

,則i%3

相等的索引為一組,比如索引1,

1+3,

1+3*2

一般增量公式為:increment = increment/3+1;

演算法實現如下:

1. // o(n^(3/2)) 

2. //不穩定排序演算法

3. public static int shell_sort(int arr)  

14. arr[j + increment] = tmp; 

15. } 

16. } 

17. } while (increment > 1); 

18. return arr;  }

排序 排序演算法整理

經常零零散散的用到排序演算法,將幾類常見的總結下來 時間複雜度o n 2 空間複雜度o 1 穩定排序 param arr public static void insersort int arr else arr j 1 tmp 氣泡排序 時間複雜度 o n 2 空間複雜度o 1 穩定排序 para...

排序演算法整理

template void cinsertsort mysort function compare template void cselectsort mysort function compare swap datas i datas id void cshellsort mysort funct...

排序演算法整理

先把常用排序演算法進行分類 插入排序 直接插入排序 折半插入排序 希爾排序 交換排序 氣泡排序 快速排序 選擇排序 簡單選擇排序 堆排序 歸併排序 基數排序 下面我們乙個乙個來看 1.直接插入排序 進行n 1趟排序,每趟把乙個元素插入到前面已經排好序的序列中,其時間複雜度為o n 並且由於判斷要插入...