首页 > 代码库 > 选择、插入、冒泡排序
选择、插入、冒泡排序
选择、插入、冒泡三种算是最典型的排序算法了,空间复杂度都为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 _DEBUG print(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 _DEBUGprint(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; } }
选择、插入、冒泡排序
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。