快速排序和堆排序
2011-09-28 22:51
218 查看
快速排序是对冒泡排序的一种改进。它的基本思想是:选取一个枢轴元素,通过一次排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都小于或者等于枢轴,另外一部分的所有数据都要大于或者等于枢轴,然后再按次方法对这两部分数据分别进行快速排序,整个排序过程可以递归或者非递归进行,以此达到整个数据变成有序序列。
堆的外观为完全二叉树的最小或最大树,堆排序用的堆是最大堆,即堆顶元素最大的堆。堆排序的程序构思:
1、读取数值存入二叉树数组a中;
2、将二叉树转成最大堆;
3、堆的最大值a[1]和数组最后一个数值交换;
4、其余数值进行堆重建;
5、重复3、4,直到所有值均排序完成。
堆的外观为完全二叉树的最小或最大树,堆排序用的堆是最大堆,即堆顶元素最大的堆。堆排序的程序构思:
1、读取数值存入二叉树数组a中;
2、将二叉树转成最大堆;
3、堆的最大值a[1]和数组最后一个数值交换;
4、其余数值进行堆重建;
5、重复3、4,直到所有值均排序完成。
#include<stdio.h> #include <stdlib.h> #include <time.h> #define N 15 //待排元素个数 void swap(int *a, int *b) { int temp; temp = *a; *a = *b; *b = temp; } //快速排序 int partition(int a[], int low, int high) { int pivot = a[high];//选取a[high]作主元 int i = low - 1; for (int j = low; j < high; j++ ) { if(a[j] <= pivot) { i++; swap(&a[i], &a[j]); } } swap(&a[high], &a[i+1]);//将主元和最左的、大于pivot的元素交换 return i+1; } //int partition(int a[], int low, int high) { // int pivot = a[low]; // int temp = a[low]; // while(low < high) { // while(low < high && a[high] >= pivot) --high; // a[low] = a[high]; // while(low < high && a[low] <= pivot) ++low; // a[high] = a[low]; // } // a[low] = temp; // // return low; //} void quicksort(int a[], int low, int high) { if(low < high) { int p = partition(a, low, high); quicksort(a, low, p-1); quicksort(a, p+1, high); } } //调整堆 void heapify(int a[], int i, int n) { int largeindex = -1; int left = 2 * i; int right = 2 * i + 1; if(left < n && a[left] > a[i]) largeindex = left; else largeindex = i; if(right < n && a[right] > a[largeindex]) largeindex = right; if(largeindex != i) { swap(&a[i], &a[largeindex]); heapify(a, largeindex, n); } } void buildheap(int a[], int n) { for(int i = n/2; i >= 1; i--) { heapify(a, i, n); } } //堆排序 void heapsort(int a[], int n) { buildheap(a, n); printf("Heap:\n"); for(int i = 1; i < n; i++) { printf("%d ", a[i]); } printf("\n"); for (int i = n-1; i >= 1; i--) { swap(&a[1], &a[i]); heapify(a, 1, i); } } int main( ) { int a ; srand((unsigned) time(NULL)); for(int i = 1; i < N; i++) { a[i] = rand() % 50; } printf("before:\n"); for(int i = 1; i < N; i++) { printf("%d ", a[i]); } printf("\n"); quicksort(a, 1, N-1);//快速排序{a[1],...a[N-1]} //heapsort(a, N);//堆排序{a[1], a[2],...a[N-1]} printf("after:\n"); for(int i = 1; i < N; i++) { printf("%d ", a[i]); } printf("\n"); return 0; }
相关文章推荐
- 【Java】快速排序、归并排序、堆排序、基数排序实现总结
- 直接插入排序,冒泡排序,快速排序,简单选择排序,堆排序,2-路归并排序,文件存储
- 插入排序、快速排序、堆排序
- 三大排序算法(快速排序,归并排序,堆排序)
- c# 自定义排序类(冒泡、选择、插入、希尔、快速、归并、堆排序等)
- 排序总结:插入(简单和改进)、希尔、选择、冒泡、快速、堆排序、归并排序
- 选择排序、快速排序、希尔排序、堆排序不是稳定的排序算法,而冒泡排序、插入排序、归并排序和基数排序是稳定的排序算法。
- 冒泡排序、快速排序、堆排序
- Java高级排序(希尔排序,快速排序,堆排序,归并排序,桶排序)
- 常用的排序算法(快速排序、插入排序、希尔排序、堆排序、冒泡排序、选择排序、归并排序)
- 快速排序 归并排序 堆排序 希尔排序
- 对c语言系统库函数、堆排序、希尔排序、折半插入排序、快速排序消耗时间的比较
- 插入排序,希尔排序,堆排序,归并排序,快速排序Java实现
- 冒泡排序、选择排序、堆排序、快速排序、插入排序算法复杂度分析与算法实现(自己总结与转)
- 快速排序 归并排序 堆排序 希尔排序
- C++排序:冒泡排序,简单选择排序,直接插入排序,希尔排序,堆排序,归并排序,快速排序
- 快速排序、希尔排序、插入排序、选择排序、归并排序、堆排序总结
- 几种常用的排序算法的分析及java实现(希尔排序,堆排序,归并排序,快速排序,选择排序,插入排序,冒泡排序)
- 元素排序几种常用的排序算法的分析及java实现(希尔排序,堆排序,归并排序,快速排序,选择排序,插入排序,冒泡排序)
- leetcode 215. Kth Largest Element in an Array 堆排序的简单应用 + 快速排序