1.快速排序
快速排序是不稳定的排序算法,平均时间复杂度O(nlgn)。快速排序是利用了partition( )进行排序的。partition( )有两种实现形式,(1)利用两个指针一个头指针,一个尾指针,通过交换头尾指针所指的数进行排序; (2)一前一后两个指针同时从左往右进行遍历,如果前指针所遇到的数比主元小,则后指针右移一位,然后交换。Partition方法还可以用在很多地方,注意举一反三。
//quicksort 时间复杂度O(n^2),不稳定排序 void quicksort (int array[],int left,int right) { if (left < right) { int i = left, j = right; int x = array[left]; while (i < j) { while (i < j && array[j] >= x) j--; if (i < j) array[i++] = array[j]; while (i < j && array[i] <= x) i++; if (i < j) array[j--] = array[i]; } array[i] = x; quicksort (array,left,j-1); quicksort (array,j+1,right); } }
2.堆排序
堆排序是不稳定的排序算法,平均时间复杂度O(nlgn)。
//堆排序 void heap_build (int array[],int i,int len) { int left = 2*i; int right = 2*i+1; int max = i; if (left < len && array[left] > array[max]) max = left ; if (right < len && array[right] > array[max]) max = right; if (max!=i) { swap(array[max],array[i]); heap_build (array,max,len); } } void heap_sort(int array[],int n) { int i; for (i=n/2;i>=0;i--) { heap_build(array,i,n); } for (i=n-1;i>=1;i--) { swap(array[0],array[i]); n=n-1; heap_build(array,0,n); } }
稳定的排序算法:直接插入排序,冒泡排序,归并排序,基数排序。
原文:http://blog.csdn.net/hnuzengchao/article/details/40662547