八大排序演算法

2021-09-29 17:52:51 字數 3198 閱讀 9058

排序演算法分為: 三大基本排序---氣泡排序,選擇排序,插入排序

高階排序---------希爾排序,快速排序,歸併排序,堆排序

非比較排序------基數排序

1.氣泡排序

基本思想:兩個數比較大小,較大的數下沉,較小的數冒起來,依次把最小,次小的排在前面,最後完成排序

平均時間複雜度:o(n2)

public class bubblesort }}

}public static void qrsort(int arr)

}//後面陣列有序跳出迴圈

if (false) }}

}

2.選擇排序基本思想:在長度為n的無序陣列中,第一次遍歷n-1個數,找到最小的數值與第乙個元素交換;

第二次遍歷n-2個數,找到最小的數值與第二個元素交換

平均時間複雜度:o(n2)

public class selctionsort 

}//判斷交換

if (i != index) }}

}

3.插入排序基本思想:在要排序的一組數中,假定前n-1個數已經排好序,現在將第n個數插到前面的有序數列中,使得這n個數也是排好順序的。如此反覆迴圈,直到全部排好順序。

平均時間複雜度:o(n2)

public class insertionsort  else }}

}}

4.希爾排序輔助理解:挖坑填數

public class quicksort 

int i = start;

int j = end;

int key = arr[i];

while (i < j)

if (i < j)

while (i < j && key > arr[i])

if (i < j)

}//i == j

arr[i] = key;

sort(arr, start, i-1);

sort(arr, i+1, end);}}

6.歸併排序基本思想:可以將a,b組各自再分成2組。依次類推,當分出來的小組只有1個資料時,可以認為這個小組組內已經達到了有序,然後再合併相鄰的2個小組就可以了。這樣通過先遞迴的分解數列再合併數列就完成了歸併排序。

平均時間複雜度:o(nlogn)

public class mergesort 

}//合併陣列

public static void meragearray(int arr, int start, int middle, int end, int temp) else

}while (i <= j)

while (k <= l)

for (int ii = start; ii <= end; ii++) }}

7.堆排序基本思想:建立二叉樹,其中i的子節點為2*i+1,和2*i+2。然後建立最小(大)樹,可以保證每次最小(大)的值在0位置,取出放置陣列後端,最後調整二叉樹的長度,重新恢復堆,重複操作獲取有序的陣列,最小樹構建有大到小的陣列

平均時間複雜度:o(nlogn)

public class heapsort 

}//最小樹,大數下沉

public static void minheapfixdown(int arr, int start, int end)

if (arr[j] >= arr[i])

temp = arr[i];

arr[i] = arr[j];

arr[j] = temp;

i = j;

j = 2 * j + 1;}}

public static void sort(int arr) }}

8.基數排序binsort想法非常簡單,首先建立陣列a[maxvalue];然後將每個數放到相應的位置上(例如17放在下標17的陣列位置);最後遍歷陣列,即為排序後的結果

基本思想:基數排序是在binsort的基礎上,通過基數的限制來減少空間的開銷。

過程:先判斷最大數的位數,有個位數直到最大位數,依次進行分組,在對應的陣列,由於是對基數分組,分好後依次取出就是相應位數的排序,所以由個位數到最大位數迴圈操作後就得到有序序列。如下圖

//計算每乙個陣列的大小

for (int j = 0; j < n; j++)

/*** 每乙個cnt陣列的大小等於前面陣列的和加上本陣列的大小

* 這樣是為了方便計算對於數的位置,等於直接在temp中劃分出對應的位置放置數

* 直接把temp劃分為對應位置,例如cnt[j]的陣列劃分了為 cnt[j-1]-1 到 cnt[j]-1 之間

*/for (int j = 1; j < radix; j++)

for (int j = 0; j < n; j++)

//放置原陣列

for (int j = 0; j < n; j++) }}

}

八大排序演算法

1.直接插入排序 原理 將陣列分為無序區和有序區兩個區,然後不斷將無序區的第乙個元素按大小順序插入到有序區中去,最終將所有無序區元素都移動到有序區完成排序。要點 設立哨兵,作為臨時儲存和判斷陣列邊界之用。實現 void insertsort node l,int length void shell ...

八大排序演算法

一 概述 八大排序演算法包括 1 插入排序之直接插入排序 straight insertion sort 2 插入排序之希爾排序 shells sort 3 選擇排序之簡單選擇排序 selection sort 4 選擇排序之堆排序 heap sort 5 交換排序之氣泡排序 bubble sort...

八大排序演算法

排序的定義 輸入 n個數 a1,a2,a3,an 輸出 n個數的排列 a1 a2 a3 an 使得a1 a2 a3 an in place sort 不占用額外記憶體或占用常數的記憶體 插入排序 選擇排序 氣泡排序 堆排序 快速排序。out place sort 歸併排序 計數排序 基數排序 桶排序...