1、概述 ios
排序有好幾種方法,能夠經過插入、交換、選擇、合併等一些方式來讓一些數據按照咱們指望的方式顯示,讓咱們能夠更加清楚明白咱們所須要的信息。算法
舉個例子,操做系統的文件瀏覽器能夠按照各類方式顯示咱們的文件,常見的windows系統中能夠經過編程
咱們能夠尋找本身最近修改的文檔(按照時間降序),也能夠按照名字字母來排序。也能夠按照文件類型來找,也能夠經過按照時間來排序。這些簡單的功能能夠給咱們提供了不少功能,計算機也就是有了中斷等簡單功能造就了強大的選擇能力。windows
2、排序的種類瀏覽器
按照維基百科上的介紹,能夠分爲穩定的、不穩定的、不實用的(穩定不穩定是經過數學公式來計算的,穩定的表明就像冒泡算法同樣,對數據沒有任何指望,不穩定算法就比較差了,最壞和最好差的好多)。dom
此次咱們只作如下幾種算法分析(皆不須要額爲空間)優化
穩定的:冒泡排序、插入排序、基數排序。spa
不穩定的:選擇排序、希爾排序、快速排序、堆排序。操作系統
說明:雖然徹底逆序的狀況下,快速排序會降到選擇排序的速度,不過從機率角度來講(參考信息學理論,和機率學),不對算法作編程上優化時,快速排序的平均速度比堆排序要快一些。這也就是C#也以快速排序爲默認排序方式。code
3、冒泡排序
冒泡排序的邏輯關係在於,以每次循環(最外層)都會找到一個除了上一個循環找到的的最大或最小值的次最大最小值(這裏的次表明次於上一個,是相對),由於,每次循環都會拿兩個相鄰的做比較,符合,ok,不符合,交換,這樣就每次大的循環都會有一個最大或最小值被咱們一個個經過對比找出來。
直接上圖就像氣泡在水中會上浮同樣。
冒泡算法的代碼以下:
代碼:
1 #include <iostream> 2 #include <iterator> 3 #include <vector> 4 #include <ctime> 5 #include <random> 6 #include <functional> 7 #include <algorithm> 8 using namespace std; 9 int intSwap(int& a,int& b)//交換 10 { 11 int intswaptemp=a; 12 a=b; 13 b=intswaptemp; 14 return 0; 15 } 16 int BullerSort(vector<int> &ivec) 17 { 18 //大的循環,每次循環會找出次最大最小值(第一次固然就是最大值) 19 //假設咱們要從小到大 20 for(int i=0;i<ivec.size();i++) 21 { 22 //這裏咱們定義從首---->>>尾,反之也行,只須要對應修改便可 23 for(int j=0;j<ivec.size()-i;j++) 24 { 25 if(ivec[j]>ivec[j+1]) 26 intSwap(ivec[j],ivec[j+1]); 27 } 28 } 29 return 0; 30 } 31 32 int main() 33 { 34 clock_t start,end; 35 vector<int> ivec; 36 srand(14); 37 for(int i=0;i<10000;i++)//10k 38 ivec.push_back((int)rand());//這裏最好不要這樣,應該臨時設定一個變量用於保存隨機值。防止出現不可預知的問題 39 40 start=clock(); 41 BullerSort(ivec); 42 end=clock(); 43 for(int i=0;i<10000;i+=500) 44 cout<<ivec[i]<<'\t'; 45 cout<<endl; 46 cout<<"the time is "<<end-start<<endl; 47 return 0; 48 }
結果爲:
今晚困了,明天接着寫。冒泡還沒完呢~~