#include <iostream> #include <vector> #include <stack> using namespace std; //插入排序 void inertsort(int *a,int n) { int i,j,temp; for(i =1;i < n;i++) { j = i; while(j > 0&& a[j] < a[j-1]) //插入的值需要与原先序列中的值依次比较大小 { temp = a[j]; a[j] = a[j-1]; a[j-1] = temp; j--; } } } //快速排序 void quicksort(int *a,int low, int high) { int key = a[low]; int i = low; int j = high; while(i < j) { if(i < j) { while(i < j&&a[j] >= key) //从后往前寻找第一个小于key的值 { j--; } if(i < j) { a[i] = a[j]; i += 1; while(i<j&&a[i]<= key) //从前往后寻找第一个大于Key的值 { i++; } if(i <j) { a[j] = a[i]; j--; } } } } a[i] = key; if(low < i-1) quicksort(a,low,i-1); if(j+1< high) quicksort(a,j+1,high); } //归并排序 void merge(int *a, int low,int mid,int high,int *c) //将a[low:mid]数组和a[mid+1,high]数组合并到数组c中 { int k = 0; int idxa = low,idxb = mid +1; while(idxa <= mid && idxb <= high) { if(a[idxa] <= a[idxb]) { c[k++] = a[idxa++]; } else { c[k++] = a[idxb++]; } } while(idxa <= mid) //如果a[low:mid]数组有剩余,则说明剩余的值都比a[mid+1,high]大 { c[k++] = a[idxa++]; } while(idxb <= high) //同上 { c[k++] = a[idxb++]; } for(int i =0; i < k; i++) //最后将值赋给数组a,由于每次low的起始位置不定,不始终为0 { a[low+i] = c[i]; } } void mergesort(int *a,int low,int high, int *c)//依次递归直到只有一个元素,此时有序 { int mid = 0; if(low < high) { mid = (low + high)/2; mergesort(a,low,mid,c); mergesort(a,mid+1,high,c); merge(a,low,mid,high,c); } } int main(void) { int a[7] = {1,3,5,7,9,0,8}; int c[10] ={0} ; mergesort(a,0,6,c); for(int i=0;i<7;i++) { cout<<a[i]; } return 0; }
其中插入排序和快速排序均属于内排序,而归并排序则是外排序,由于归并排序使用了外部内存,用空间换取了时间,所以归并排序的时间复杂度最坏和最好都为O(N*logN),快速排序最好为O(N*logN),最坏为O(N^2);