快速排序和堆排序


    快速排序是对冒泡排序的一种改进。它的基本思想是:选取一个枢轴元素,通过一次排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都小于或者等于枢轴,另外一部分的所有数据都要大于或者等于枢轴,然后再按次方法对这两部分数据分别进行快速排序,整个排序过程可以递归或者非递归进行,以此达到整个数据变成有序序列。

    堆的外观为完全二叉树的最小或最大树,堆排序用的堆是最大堆,即堆顶元素最大的堆。堆排序的程序构思:

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;
}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值