演算法的六種排序

2022-10-10 20:36:09 字數 3968 閱讀 3727

一、選擇排序法

簡單選擇排序是最簡單直觀的一種演算法,基本思想為每一趟從待排序的資料元素中選擇最小(或最大)的乙個元素作為首元素,直到所有元素排完為止,簡單選擇排序是不穩定排序。

for (int i = 0; i < arr.length - 1; i++)

}}簡單選擇排序通過上面優化之後,無論陣列原始排列如何,比較次數是不變的;對於交換操作,在最好情況下也就是陣列完全有序的時候,無需任何交換移動,在最差情況下,也就是陣列倒序的時候,交換次數為n-1次。綜合下來,時間複雜度為

)

二、氣泡排序

氣泡排序的基本思想是,對相鄰的元素進行兩兩比較,順序相反則進行交換,這樣,每一趟會將最小或最大的元素「浮」到頂端,最終達到完全有序

for (int i = 0; i < arr.length - 1; i++) 

}if (flag)

}

根據上面這種冒泡實現,若原陣列本身就是有序的(這是最好情況),僅需n-1次比較就可完成;若是倒序,比較次數為 n-1+n-2+
...

+1=n(n-1)/2,交換次數和比較次數等值。所以,其時間複雜度依然為o(n
2

)。綜合來看,氣泡排序效能還還是稍差於上面那種選擇排序的。

三、插入排序

直接插入排序基本思想是每一步將乙個待排序的記錄,插入到前面已經排好序的有序序列中去,直到插完所有元素為止

}

簡單插入排序在最好情況下,需要比較n-1次,無需交換元素,時間複雜度為o(n);在最壞情況下,時間複雜度依然為o(n2)。但是在陣列元素隨機排列的情況下,插入排序還是要優於上面兩種排序的。

public class shellsort ;

11 sort(arr);

12 system.out.println(arrays.tostring(arr));

13 int arr1 =;

14 sort1(arr1);

15 system.out.println(arrays.tostring(arr1));

16 }

17 18 /**

19 * 希爾排序 針對有序序列在插入時採用交換法

20 * @param arr

21 */

22 public static void sort(int arr)(希爾增量),其最壞時間複雜度依然為o(n2)

五、堆排序

堆排序是利用這種資料結構而設計的一種排序演算法,堆是完全二叉樹,堆排序是一種選擇排序,它的最壞,最好,平均時間複雜度均為o(nlogn),它也是不穩定排序。首先簡單了解下堆結構。

總結堆排序:

a.將無需序列構建成乙個堆,根據公升序降序需求選擇大頂堆或小頂堆;

b.將堆頂元素與末尾元素交換,將最大元素"沉"到陣列末端;

c.重新調整結構,使其滿足堆定義,然後繼續交換堆頂元素與當前末尾元素,反覆執行調整+交換步驟,直到整個序列有序。

public class heapsort ;

sort(arr);

system.out.println(arrays.tostring(arr));

}public static void sort(int arr)

//2.調整堆結構+交換堆頂元素與末尾元素

for(int j=arr.length-1;j>0;j--)

}/**

* 調整大頂堆(僅是調整過程,建立在大頂堆已構建的基礎上)

* @param arr

* @param i

* @param length

*/public static void adjustheap(int arr,int i,int length)else

}arr[i] = temp;//將temp值放到最終的位置

}/**

* 交換元素

* @param arr

* @param a

* @param b

*/public static void swap(int arr,int a ,int b)

}六、歸併排序

----------------------歸併之分治

上層鋪蓋顏色的部分是「分」    下層無顏色部分是「治」

使用分治法的兩路合併排序演算法:

就是將待排序的元素序列一分為二,得到長度基本相等的兩個子串行,分別排序。如果子串行較長,還可繼續細分,直到子串行的長度不超過1為止。當分解所得的子串行已排列有序時,將兩個有序子串行合併成乙個有序子串行,得到原問題的解。

-------------------歸併之合併 

合併方法:

比較兩序列中的最小值,輸出其中較小者,然後重複此過程,直到其中乙個隊列為空時,

如果另乙個佇列還有元素沒有輸出,則將剩餘元素依次輸出

#include

#define n 100

int merge(int *a, int left,int mid,int right)

;i=left;

j=mid+1;

while(i<=mid&&j<=right) /*把兩個序列中小的部分先輸入到中間陣列*/

return 0;

}int main()

,i,n;

printf("please input the length of the list:\n");

scanf("%d",&n);

printf("please input the number of the list:\n");

for(i=0;i

六種基本排序方式

package new03 public class demo4 sop 原序列的結果是 for int x nums sop n selectsort nums insertsort nums bubblesort nums quicksort nums shellsort nums heapso...

六種qsort排序方法

本文中排序都是採用的從小到大排序 一 對int型別陣列排序 int num 100 sample int cmp const void a const void b qsort num,100,sizeof num 0 cmp 二 對char型別陣列排序 同int型別 char word 100 s...

六種排序的C 實現

class sortnum 具體實現 view plain copy to clipboard print?include sortnum.h include iostream.h construction destruction sortnum sortnum sortnum sortnum 交換...