选择、插入、冒泡三种算是最典型的排序算法了,空间复杂度都为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;} }