第一次了解桶排序的時候,是在c語言課本的乙個題目。題目大概意思是要將三萬個學生的成績進行排名,分數從0分到100分。桶排序的時間複雜度時o(m+n)。所以就可以申請乙個大小為100的為int型別的陣列,然後將陣列初始化為0,再將陣列的下標看作為分數,把陣列元素中儲存的數值對應著獲得該分數的人數,這樣分數就自己在陣列中有了排名,最後再用迴圈依次輸出,只是輸出的時候要看該分數有多少人獲得,就重複輸出多少次。
實現**如下
#include
int main()
/*輸入學生成績,加入有十個人的成績*/
for(int i=0; i<10; i++)
for(int i=0; i<100; i++)}}
printf("\n");
return
0;}
總結:
桶排序是最快最簡單的排序,時間複雜度僅僅是o(m+n),但是桶排序很浪費空間,並且有侷限性(比如只能輸出整數,小數的話就不能使用桶排序)
氣泡排序的基本思想就是比較兩個相鄰的元素,如果順序錯誤就交換過來。假如有10個數字需要進行排序,那麼大迴圈就要排n-1次(因為每次只能確定將乙個數字歸位)所以小迴圈要根據歸位後的數字再進行相鄰比較,就要比較n-1-i次。時間複雜度為o(n^2)。**核心部分是兩重迴圈。
**
#include
int main()
int n = 10;
/*氣泡排序*/
for(int i=0; i1; i++)}}
for(int i=0; iprintf("%d ", a[i]);
}printf("\n");
return
0;}
總結:
氣泡排序每一大趟只能歸位乙個數,所以有n個數字的時候,需要進行(n-1)個數字進行歸位。時間複雜度為o(n^2)。
選擇排序的原理是:首先在未排序的序列裡找到最小(大)元素,放到序列的首端,再從剩餘元素中找到最小(大)的元素,放到序列的尾端。依次迴圈,直到排序完成。
選擇排序的交換操作介於 0 和 (n - 1) 次之間。選擇排序的比較操作為 n (n - 1) / 2 次之間。選擇排序的賦值操作介於 0 和 3 (n - 1) 次之間。**比較次數o(n^2),比較次數與關鍵字的初始狀態無關,總的比較次數n=(n-1)+(n-2)+…+1=n*(n-1)/2。交換次數o(n),最好情況是,已經有序,交換0次;最壞情況交換n-1次,逆序交換n/2次。交換次數比氣泡排序少多了,由於交換所需cpu時間比比較所需的cpu時間多,n值較小時,選擇排序比氣泡排序快。
#includeint main()
for(int i=0; i1; i++)
}if(min != i)
}for(int i=0; i"%d ",a[i]);
}printf("\n");
}
總結:
選擇排序的交換次數比冒泡更少,所以相比冒泡時間更快。
快速排序之前資料結構上過,但是沒有實際上手**。快速排序的話,比較跨度更大,相比冒泡更快。快速排序需要找乙個基數,然後從一堆資料的前和後,分別檢索,將比基數小的數字放在左邊,比基數大的放在右邊(若果是從小排到大的話)。相比氣泡排序,快速排序每次交換是跳躍式的,而冒泡只是相鄰兩個數字比較。平均時間複雜度為o(nlogn)。快速排序的思想是建立在二分法上的。
假如排序數列為 6 23 45 98 7 10,那麼第乙個數字為基數,基數就是6,然後從兩端開始探測,先從10開始往左尋找小於6的數字,直到找到為止,再從6開始往右邊探測,找到比6大的數字,然後進行交換,直到從左到右探測的標誌點和從右向左的標誌點相遇的時候,第一輪探測才結束,然後第二輪的時候,以6為分界點,將數列一分為二再同時進行第二輪探測,直到所有的數字都歸位,排序結束。
**
#include
int a[1000];
void quicksort(int left, int right)
int temp,t,i,j;
temp = a[left];
i = left;
j = right;
while(i != j)
//j檢索結束後,i再開始檢索比基數大的數字,比基數大的數字排在基數右邊,若比基數小,繼續向右邊檢索
while(a[i] <= temp && i < j)
if(i < j)
}/*當i與j相遇的時機,基數歸位結束,此時要交換基數的位置,temp相當於中間交換變數*/
a[left] = a[i];
a[i] = temp;
/*再以二分法的思想,進行再次分別排序,利用遞迴*/
quicksort(left,i-1);
quicksort(i+1,right);
}int main()
quicksort(0,n-1);
for(int i=0; iprintf("%d\t",a[i]);
}printf("\n");
return
0;}
總結:
**實現是通過遞迴實現的,所以要注意遞迴結束的條件。
排序方法挺多的,希望自己可以慢慢從思想上和**中去領悟吧。。。。
桶排序 氣泡排序 快速排序
3 實現 3.1最簡單粗暴滴方法 include includeusing namespace std int main for i 0 i 10 i 依次判斷a 0 a 10 for j 1 j a i j 依次列印排序好的數列 cout 說明 1 只能輸入事先預定設定的陣列個數 2 陣列中每個數...
桶排序,氣泡排序和快速選擇排序的實現
桶排序,氣泡排序和快速選擇排序的實現 排序是常需要我們去解決的問題,在學習演算法的過程中也接觸到了幾種常見的排序演算法。不論使用什麼樣的語言去實現排序演算法但是其原理都是一樣的。那麼在接下來的就介紹上面所說的三種排序演算法。1.桶排序,可以將其描述為乙個二維陣列的儲存資料的過程。在這裡我們給出一組資...
氣泡排序,選擇排序,快速排序
1.氣泡排序 氣泡排序 bubble sort 最為簡單的一種排序,通過重複走完陣列的所有元素,通過打擂台的方式兩個兩個比較,直到沒有數可以交換的時候結束這個數,再到下個數,直到整個陣列排好順序。因乙個個浮出所以叫氣泡排序。雙重迴圈時間o n 2 void bubblesort int arr in...