C/C++程序员:基本排序算法之快速排序

快速排序
10 80 30 60 50 40 70 20 90
                      ^
10 30 40 20 50 70 90 80 60
      ^                             ^
10 20 30 40 50 70 60 80 90
1)算法
A.从待排序序列中任意选择一个元素,作为基准;
B.将所有小于基准的元素放在基准之前,大于基准的元素放在
   基准之后,等于基准的元素放在基准之前或之后,这个过程
   成为分组;
C.以递归的方式,分别对基准之前和基准之后的分组继续进行
   分组,直到每个分组内的元素个数不多于一个为止。
就地分组:
50
10 20 30 40 50 80 70 60 90
                      i
                      p
                      j
2)评价
A.平均时间复杂度:O(NlogN)
B.非稳定排序。
C.如果每次都能均匀分组,可以达到最快的排序效果。选择中间

   位置作为基准,产生均匀分组的概率最高。

#include <stdio.h>
#include <stdlib.h>
/* 快速排序 */
void quick_sort (int data[], size_t left,
	size_t right) {
	size_t p = (left + right) / 2;
	int pivot = data[p];
	size_t i = left, j = right;
	while (i < j) {
		for (; ! (i >= p || pivot < data[i]); ++i);
		if (i < p) {
			data[p] = data[i];
			p = i;
		}
		for (; ! (j <= p || data[j] < pivot); --j);
		if (j > p) {
			data[p] = data[j];
			p = j;
		}
	}
	data[p] = pivot;
	if (p - left > 1)
		quick_sort (data, left, p - 1);
	if (right - p > 1)
		quick_sort (data, p + 1, right);
}
/* 测试用例 */
int main (void) {
	srand (time (NULL));
	int data[10];
	size_t i, size = sizeof(data) / sizeof(data[0]);
	for (i = 0; i < size; ++i)
		printf ("%2d ", data[i] = rand () % 100);
	printf ("\n");
	quick_sort (data, 0, size - 1);
	for (i = 0; i < size; ++i)
		printf ("%2d ", data[i]);
	printf ("\n");
	return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值