快速排序

快速排序,虽然最坏时候的时间复杂度是O(n*n),但是平均时间复杂度是O(nlogn),所以快排是一个效率蛮高的排序方法。

下面可以参考一下实现

///
// 文件名称: qSort.c
// 功能:实现简单的快排
//
// 快排的基本思想是, 在数组中,选定某一元素为支点, 将
// 将小于该支点的数排在该数的左边, 大于该支点的数排在它右边
// 这样此支点就找到了自己的正确的位置。反复迭代,就直到完全排好序
//
// 参考算法导论 (对于partition, 算法导论和 数据结果上略微有点不同同)
///
#include <stdio.h>


///
// 功能描述: 在数组A中, 将下标为q到r的部分进行操作, 使得以 A[r]为支点
// 			将大于A[r]排在它的左边, 小于A[r]的放在它的右边
// 输入参数: 
// 			A: 指向数组的指针
// 			q: 操作的起始下标
// 			r: 操作的数组的终止下标
// 输出参数:
// 			无
// 返回值:
// 			A[r] 即支点的新位置
///
int partition(int *A, int q, int r)
{
	if (q>r)
		return -1;
	int i = 0, j = 0, temp = 0, x = 0;
	i = q - 1; //记录当前小于A[r]的数中,最右边那个数的位置
	j = q; //遍历 A[q] 到 A[r]的变量
	x = A[r]; //记录支点

	for (j=q; j<r; j++){
		if (A[j]<x){
			//因A[i]是最右边的小于x的, A[i+1]>=x
			//所以此时 A[i+1]和 A[j]进行交换, 让小于x的放在一起
			i++;
			temp = A[i];
			A[i] = A[j];
			A[j] = temp;
		}
	}

	//for 循环结束后, A[p]到A[r-1]已经被分开了,
	//其中A[q] 到A[i]是小于 x(A[r])的, A[i+1]到A[r-1]是不小于x
	//所以,接下来, 应该??? A[r] 和  A[i+1] 交换
	
	i++;
	temp = A[i];
	A[i] = x;
	A[r] = temp;

	return i; //返回 A[r]的位置
}

//递归进行排序
void qSort(int *A, int q, int r)
{
	int pivot = 0;
	pivot = partition(A, q, r); //使A[r]恢复到正确的位置

	if (pivot == -1)
		return ;

	qSort(A, q, pivot-1); //依次将 A[q]--A[pivot-1]排好序
	qSort(A, pivot+1, r);
}

//main函数测试
int main()
{
	int A[10] = {40, 30, 20, 60, 90, 80, 10, 50, 70, 1};

	qSort(A, 0, 9);

	int i = 0;
	for (i=0; i<10; i++){
		printf("%d", A[i]);
		if (i<9)
			printf("\t");
	}
	printf("\n");

	return 0;
}

 

 

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值