快速排序和堆排序
2014-10-31 22:30
211 查看
1.快速排序
快速排序是不稳定的排序算法,平均时间复杂度O(nlgn)。快速排序是利用了partition( )进行排序的。partition( )有两种实现形式,(1)利用两个指针一个头指针,一个尾指针,通过交换头尾指针所指的数进行排序; (2)一前一后两个指针同时从左往右进行遍历,如果前指针所遇到的数比主元小,则后指针右移一位,然后交换。Partition方法还可以用在很多地方,注意举一反三。
2.堆排序
堆排序是不稳定的排序算法,平均时间复杂度O(nlgn)。
稳定的排序算法:直接插入排序,冒泡排序,归并排序,基数排序。
快速排序是不稳定的排序算法,平均时间复杂度O(nlgn)。快速排序是利用了partition( )进行排序的。partition( )有两种实现形式,(1)利用两个指针一个头指针,一个尾指针,通过交换头尾指针所指的数进行排序; (2)一前一后两个指针同时从左往右进行遍历,如果前指针所遇到的数比主元小,则后指针右移一位,然后交换。Partition方法还可以用在很多地方,注意举一反三。
//quicksort 不稳定排序 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); } }
稳定的排序算法:直接插入排序,冒泡排序,归并排序,基数排序。
相关文章推荐
- 插入排序、选择排序、归并排序、堆排序、快速排序的JAVA实现
- 直接插入排序、快速排序和堆排序的C实现
- 排序(快速排序和堆排序)练习
- 快速排序和堆排序为什么快排更常用
- 比较排序之堆排序和快速排序
- 算法有插入排序,堆排序,合并排序,快速排序和stooge排序
- 【算法与数据结构】冒泡、插入、归并、堆排序、快速排序的Java实现代码
- 快速排序和堆排序
- 冒泡、插入、归并、堆排序、快速排序的Java实现代码
- [C] - 希尔排序,非递归的快速排序,递归的快速排序,堆排序,归并排序,基数排序
- 排序算法-快速排序和堆排序
- 代码合集:健壮的二分查找,高效的堆排序和快速排序
- 排序算法总结-插入排序、希尔排序、堆排序、快速排序
- 排序算法(堆排序、插入排序、归并排序、快速排序)
- javascript冒泡排序,快速排序和堆排序
- 快速排序与堆排序的实现
- 排序算法一(直接选择,堆排序,冒泡排序和快速排序)
- 快速排序,堆排序和归并排序谁更快?
- 关于堆排序、归并排序、快速排序的比较,到底谁快
- 排序算法java版,速度排行:冒泡排序、简单选择排序、直接插入排序、折半插入排序、希尔排序、堆排序、归并排序、快速排序