C 快速排序

快速排序描述

  1. 从数列中挑出一个元素,称为 "基准"(pivot)

  2. 重新排序数列,所有元素比基准值小的摆放在基准前面,所有元素比基准值大的摆在基准的后面(相同的数可以到任一边)。在这个分区退出之后,该基准就处于数列的中间位置。这个称为分区(partition)操作。

  3. 递归地(recursive)把小于基准值元素的子数列和大于基准值元素的子数列排序。

示例代码

示例代码为C语言,输入参数中,需要排序的数组为arr[],取出一个元素为pivot,并根据 pivot值,将数组按照大于pivot和小于pivot分为两个区域,递归完成排序。

 1 #include <stdio.h>
2 #include <stdlib.h>
3
4 void quick_sort(char *arr, int begin, int end)
5 {
6 char pivot = arr[begin];
7 int i,j;
8 i = begin;
9 j = end;
10 while(i < j) {
11 while(arr[j] >= pivot && i < j)
12 j --;
13 arr[i] = arr[j];
14 while(arr[i] <= pivot && i < j)
15 i ++;
16 arr[j] = arr[i];
17 }
18 arr[i] = pivot;
19
20 if( i-1 > begin)
21 quick_sort(arr, begin, i - 1);
22 if( end > i + 1)
23 quick_sort(arr, i + 1, end);
24 }
25
26 int main()
27 {
28 char ch[] = "qwertyuiopasdfghjklzxcvbnm";
29 quick_sort(ch, 0 ,25);
30 printf("%s\n", ch);
31 exit(0);
32 }

输出结果

abcdefghijklmnopqrstuvwxyz

算法分析

  最差时间复杂度  Θ(n2)   最优时间复杂度  Θ(nlog n)   平均时间复杂度  Θ(nlog n)

原理

  已知一组无序数据a[1]、a[2]、……a[n],需将其按升序排列。首先任取数据a[x]作为基准。比较a[x]与其它数据并排序,使a[x]排在数据的第k位,并且使a[1]~a[k-1]中的每一个数据<a[x],a[k+1]~a[n]中的每一个数据>a[x],然后采用分治的策略分别对a[1]~a[k-1]和a[k+1]~a[n]两组数据进行快速排序。

优劣

  优点:极快,数据移动少;缺点:不稳定。

转载于:https://www.cnblogs.com/tony_wang/archive/2011/12/07/2278788.html

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值