關於效率問題
上篇講的冒泡排序可以說是我們第一個真正的算法,他解決了桶排序的佔用空間過大的問題(因爲桶排序要根據排序的數的個數申請指定的內存),但是冒泡排序卻犧牲了非常大的效率,假設我們要給1億的數進行排序,因爲桶排序的時間複雜度是O(M+N),而冒泡的是O(N2)N的平方,假設計算機的速度是每秒10億次,桶排序只需要0.1秒,而冒泡則需要1000萬秒,大概115天,這是個很恐怖的數字, 想想都能嚇尿人。
基準數
排序原理講解
關於效率
實例
#include <stdio.h>
int a[101],n;
void quickSort(int left,int right){ //快速排序
int i,j,t,temp;
if (left > right) { //判斷參數的正確性
return;
}
temp = a[left];
i = left;
j = right;
while (i != j) { //判斷是否相遇
while (a[j] >= temp && i < j) { //右邊的是不是小於基準數
j--;
}
while (a[i] <= temp && i < j) { //左邊的是不是大於基準數
i++;
}
if (i < j) { //找到左邊大於基準數,右邊小於基準數進行交換
t = a[i];
a[i] = a[j];
a[j] = t;
}
}
a[left] = a[i]; //相遇了,把基準數位置進行調整
a[i] = temp;
quickSort(left, i - 1); //遞歸的方法進行基準數左邊的數進行調整
quickSort(i + 1, right);//遞歸的方法進行基準數右邊的數進行調整
}
int main(int argc, const char * argv[])
{
int i,n;
scanf("%d",&n); //輸入數的個數
for (i = 1; i <= n; i++) { //輸入數據
scanf("%d",&a[i]);
}
quickSort(1, n); //使用快速排序對輸入的數進行排序
for (i = 1; i <= n; i++) { //輸出排序後的數
printf("%d ",a[i]);
}
}
相信大家結合註釋都能看懂代碼,我就不細說了