排序演算法彙總

2021-07-23 19:13:42 字數 2932 閱讀 7222

由於即將面臨找工作的現實,將八大基本的排序演算法進行彙總,為以後的找工作做準備:

八大排序演算法主要包括:

1、插入排序(insertsort)

2、希爾排序(shellsort)

3、氣泡排序(bubblesort)

4、快速排序(quicksort)

5、選擇排序(selectsort)

6、堆排序(heapsort)

7、歸併排序(mergesort)

8、基數排序(oddsort)

一、穩定性:

穩定:氣泡排序、插入排序、歸併排序和基數排序

不穩定:選擇排序、快速排序、希爾排序、堆排序

二、平均時間複雜度

o(n^2):直接插入排序,簡單選擇排序,氣泡排序。

在資料規模較小時(9w內),直接插入排序,簡單選擇排序差不多。當資料較大時,氣泡排序演算法的時間代價最高。

效能為o(n^2)的演算法基本上是相鄰元素進行比較,基本上都是穩定的。

o(nlogn):快速排序,歸併排序,希爾排序,堆排序。

其中,快排是最好的, 其次是歸併和希爾,堆排序在資料量很大時效果明顯。

三、排序演算法的選擇

1.資料規模較小

(1)待排序列基本序的情況下,可以選擇直接插入排序;

(2)對穩定性不作要求宜用簡單選擇排序,對穩定性有要求宜用插入或冒泡

2.資料規模不是很大

(1)完全可以用記憶體空間,序列雜亂無序,對穩定性沒有要求,快速排序,此時要付出log(n)的額外空間。

(2)序列本身可能有序,對穩定性有要求,空間允許下,宜用歸併排序

3.資料規模很大

(1)對穩定性有求,則可考慮歸併排序。

(2)對穩定性沒要求,宜用堆排序

4.序列初始基本有序(正序),宜用直接插入,冒泡

public class sortalgorithm ;

int m=8;

//insertsort(n, m);

//shellsort(n, m);

//bubblesort(n, m);

//quicksort(n, 0, 6);

//selectsort(n, m);

//heapsort(n, m);

//mergesort(n, 0, 7);

oddsort(n);

for (int i : n) }

/**1、插入排序:

時間複雜度:

最好的情況下:正序有序(從小到大),這樣只需要比較n次,不需要移動。因此時間複雜度為o(n)

最壞的情況下:逆序有序,這樣每乙個元素就需要比較n次,共有n個元素,因此實際複雜度為o(n­2)

平均情況下:o(n­2)

穩定性:穩定*/

public static void insertsort(int n,int m)else

}} }

/** * 希爾排序:

* 時間複雜度:

* 最好情況:由於希爾排序的好壞和步長d的選擇有很多關係,因此,目前還沒有得出最好的步長如何選擇(現在有些比較好的選擇了,但不確定是否是最好的)。所以,不知道最好的情況下的演算法時間複雜度。

最壞情況下:o(n*logn),最壞的情況下和平均情況下差不多。

平均情況下:o(n*logn)

穩定性:不穩定

*/ public static void shellsort(int n,int m)else

}n[j]=temp;

}d=d/2;

} }/**

* 氣泡排序:

* 最好情況下:正序有序,則只需要比較n次。故,為o(n)

最壞情況下: 逆序有序,則需要比較(n-1)+(n-2)+……+1,故,為o(n*n)

穩定性:穩定

* @return

*/public static void bubblesort(intn,int m)

if(startn[j])

if(flag!=i)}}

}/**

* 堆排序:從演算法描述來看,堆排序需要兩個過程,一是建立堆,二是堆頂與堆的最後乙個元素交換位置。所以堆排序有兩個函式組成。

* 一是建堆的滲透函式,二是反覆呼叫滲透函式實現排序的函式。

* 時間複雜度:最壞情況下,接近於最差情況下:o(n*logn),因此它是一種效果不錯的排序演算法。

* 穩定性:不穩定

* 堆排序的最壞時間複雜度為o(nlogn)。堆序的平均效能較接近於最壞效能。由於建初始堆所需的比較次數較多,所以堆排序不適宜於記錄數較少的檔案。

*///以大頂堆為例

public static void heapsort(intn,int m)else

}//將剩餘部分放入temp陣列中

while(left<=middle)

while(mid<=right)

//將temp陣列中的資料複製回原陣列

while(p<=right)

}/**

* 基數排序:它是一種非比較排序。它是根據位的高低進行排序的,也就是先按個位排序,然後依據十位排序……以此類推。

* 時間複雜度:分配需要o(n),收集為o(r),其中r為分配後鍊錶的個數,以r=10為例,則有0~9這樣10個鍊錶來將原來

* 的序列分類。而d,也就是位數(如最大的數是1234,位數是4,則d=4),即"分配-收集"的趟數。因此時間複雜

* 度為o(d*(n+r))。

*穩定性:穩定

*/public static void oddsort(intn)

//建立十個佇列

listqueue=new arraylist();

for(int i=0;i<10;i++)

//進行times次分配和收集

for(int i=0;i0)}}

}}

排序演算法 排序演算法彙總

排序演算法無疑是學習資料結構中的重點內容,本文將給出排序演算法的彙總。下面是具體的實現 include include include define n 1000000 int array n int temp n 1 氣泡排序 void bubblesort int a,int n if tag ...

排序演算法 排序演算法彙總

排序演算法無疑是學習資料結構中的重點內容,本文將給出排序演算法的彙總。下面是具體的實現 include include include define n 1000000 int array n int temp n 1 氣泡排序 void bubblesort int a,int n if tag ...

排序演算法 排序演算法彙總

排序演算法無疑是學習資料結構中的重點內容,本文將給出排序演算法的彙總。下面是具體的實現 include include include define n 1000000 int array n int temp n 1 氣泡排序 void bubblesort int a,int n if tag ...