由於即將面臨找工作的現實,將八大基本的排序演算法進行彙總,為以後的找工作做準備:
八大排序演算法主要包括:
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(n2)
平均情況下:o(n2)
穩定性:穩定*/
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 ...