快速排序是对冒泡排序的一种改进。它的基本思想是:选取一个枢轴元素,通过一次排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都小于或者等于枢轴,另外一部分的所有数据都要大于或者等于枢轴,然后再按次方法对这两部分数据分别进行快速排序,整个排序过程可以递归或者非递归进行,以此达到整个数据变成有序序列。
堆的外观为完全二叉树的最小或最大树,堆排序用的堆是最大堆,即堆顶元素最大的堆。堆排序的程序构思:
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[N];
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;
}