选择、插入、冒泡排序
生活随笔
收集整理的這篇文章主要介紹了
选择、插入、冒泡排序
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
選擇、插入、冒泡三種算是最典型的排序算法了,空間復雜度都為O(1)
選擇排序時間復雜度跟初始數據順序無關,O(n2),而且還不穩定;
插入排序時間復雜度跟初始數據順序有關最好O(n),最壞O(n2),穩定
冒泡排序時間復雜度跟初始數據順序有關最好O(n),最壞O(n2),穩定
三種算法中對于大量隨機數,所需時間插入<選擇<冒泡。
// MySort.h: interface for the MySort class. #include "iostream.h"template<class T> void swap(T &a,T &b) {T c=a;a=b;b=c; }template<class T> void print(T a[], int n ,int i){ cout<<"第"<<i+1 <<"趟 : "; for(int j= 0; j<10; j++){ cout<<a[j] <<" "; } cout<<endl; } template<class T> void selectSort(T a[],int n) //選擇排序 {int i,j,k;for(i=0;i<n-1;++i){k=i;for(j=i+1;j<n;++j){if(a[j]<a[k])k=j;}if(k!=i)swap(a[i],a[k]); } }template<class T> void selectSort2(T a[],int n) //二元選擇排序 {int i,j,min,max;for (i=1;i <= n/2;++i) // 做不超過n/2趟選擇排序 { min = i; max = i ; //分別記錄最大和最小關鍵字記錄位置 for (j= i; j<=n-i; ++j) { if (a[j] > a[max]) { max = j ; continue ; } if (a[j]< a[min]) min = j ; } //該交換操作還可分情況討論以提高效率 swap(a[i-1],a[min]);if(max!=i)swap(a[n-i],a[max]);#ifdef _DEBUGprint(a,n,i-1); #endif} }template<class T> void insertSort(T a[],int n) //插入排序 {int i;for(i=1;i<n;++i){if(a[i]<a[i-1]){int j= i-1; T x = a[i]; //復制為哨兵,即存儲待排序元素 a[i] = a[i-1]; //先后移一個元素while(j>=0 && x<a[j]) //查找在有序表的插入位置 { a[j+1] = a[j]; //元素后移 j--; } a[j+1] = x; //插入到正確位置 } }} template<class T> void bubbleSort(T a[],int n) //冒泡排序 { /* int i,j; for(i=0; i<n-1; ++i) { for(j=0; j<n-i-1; ++j) { if(a[j] > a[j+1]) { swap(a[j],a[j+1]); } } #ifdef _DEBUG print(a,n,i); #endif } */bool bSwaped = true;int i,j;int lastSwapPos, lastSwapPos_temp = 0; for(i=0; i<n-1; ++i) { bSwaped = false; lastSwapPos = lastSwapPos_temp; for(j=n-1; j>lastSwapPos; j--) { if(a[j-1] > a[j]) { swap(a[j],a[j-1]); bSwaped = true; lastSwapPos_temp = j - 1; } } // 如果上一次掃描沒有發生交換,則說明數組已經全部有序,退出循環 if(!bSwaped)break;} }?
轉載于:https://www.cnblogs.com/nkzhangkun/p/3990923.html
創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎總結
以上是生活随笔為你收集整理的选择、插入、冒泡排序的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 使用ant自动生成签名的apk
- 下一篇: OC语言知识6