本博文介绍三中最基本的排序算法,冒泡,插入,归并。
一,冒泡:最简单,也是最直接的排序算法,从前往后,每个元素都与其后满足条件的元素交换。时间复杂度O(N^2)。
代码如下:
#include<iostream> using namespace std; void sort(int*a,int n) { int temp; for(int i=0;i<n;++i) for(int j=i+1;j<n;++j) if(a[j]<a[i]) { temp=a[j]; a[j]=a[i]; a[i]=temp; } } int main() { int a[5]={1,5,3,2,6}; sort(a,5); for(int i=0;i<5;++i) cout<<a[i]; return 0; }
二,插入:对于前面已排好的序列,用当前元素分别与前面排好顺序的元素比较,当找到满足条件的元素时,整体移动。时间复杂度为O(N^2)。
代码如下:
template <typename T> class InsertCla { public:
InsertCla(T *Arra,int length_):inputArra(Arra),length(length_){} void getSortedArra(); ~InsertCla(){} private : T* inputArra; int length; }; //非递增排列 template<typename T> inline void InsertCla<T>::getSortedArra() { int i,j; T temp; for(i=1;i<=4;i++){ temp=inputArra[i]; for(j=i-1;j>=0;j--){ if(temp<inputArra[j]){ inputArra[j+1]=inputArra[j]; }else break; } inputArra[j+1]=temp; } }
三,归并排序,归并主要利用到了分而治之,递归的思想。时间复杂度为:O(NlgN)。
对两个排好序的数组组合成一个:
void MergeSort(int* v, int first, int mid, int last) { //空间复杂度增加了 queue<int>* tempV = new queue<int>(); int indexA, indexB; indexA = first; indexB = mid; while (indexA < mid && indexB < last) { if (v[indexA] < v[indexB]) { tempV->push(v[indexA]); indexA++; } else { tempV->push(v[indexB]); indexB++; } } while (indexA < mid) { tempV->push(v[indexA]); indexA++; } while (indexB < last) { tempV->push(v[indexB]); indexB++; } int index = 0; while (tempV->size() > 0) { v[first+index] = tempV->front(); tempV->pop(); index++; } }
递归调用,深度探索:
void Merg(int* a,int first,int last ) { int middle; if(first<last) { middle=(first+last)/2; Merg(a,first,middle); Merg(a,middle+1,last); MergeSort(a,first,middle,last); } } int main() { int a[6]={5,1,2,6,3,7}; Merg(a,0,5); for(int i=0;i<6;++i) cout<<a[i]; return 0; }
测试结果: