快速排序(Quick Sort)的C语言实现

快速排序(Quick Sort)的基本思想是通过一趟排序将待排记录分割成独立的两部分,其中一部分记录的关键字均比另一部分记录的关键字小,则可分别对着两部分记录继续进行排序,以达到整个序列有序,具体步骤为

  1. 设立枢轴,将比枢轴小的记录移到低端,比枢轴大的记录移到高端,直到low=high停止
  2. 分别对枢轴低高端部分再次快速排序(即重复第1步)
  3. 重复第1、2步,直到low=high停止

C语言实现(编译器Dev-c++5.4.0,源代码后缀.cpp)

原创文章,转载请注明来自钢铁侠Mac博客http://www.cnblogs.com/gangtiexia

 1 #include <stdio.h>
 2 #include <stdlib.h>
 3 #define MAXSIZE 6
 4 #define OK 1
 5 #define ERROR 0
 6
 7 typedef int Status;
 8 typedef int KeyType;
 9 typedef char InfoType;//要malloc()
10
11 typedef struct{
12     KeyType score;
13     InfoType name[20];
14 }RedType;//记录类型
15
16 typedef struct{
17     RedType r[MAXSIZE+1];
18     int length;
19 }SqList;
20 /*
21     Name: 初始化
22     Copyright:
23     Author: leo
24     Date: 10-12-15 16:54
25     Description: 初始化顺序表
26 */
27
28 Status initSqList(SqList &l){
29     l.length=MAXSIZE;
30     printf("%d",l.length);
31     for(int i=1;i<=l.length;i++){
32         printf("请输入第%d个同学的名字和分数",i);
33         gets(l.r[i].name);
34         scanf("%d",&(l.r[i].score));
35         getchar();
36         printf("\n");
37     }
38
39     return OK;
40 }
41 /*
42     Name: 部分排序
43     Copyright: http://www.cnblogs.com/gangtiexia
44     Author: 钢铁侠
45     Date: 10-12-15 17:00
46     Description: 反复按照枢轴进行快速排序:将比枢轴大的放在一边,比枢轴小的放在另一边
47 */
48
49 int partition(SqList &l,int low,int high){
50     l.r[0]=l.r[low];//枢轴
51     while(low<high){
52         while(low<high&&l.r[high].score>l.r[0].score) high--;
53         l.r[low]=l.r[high];
54         while(low<high&&l.r[low].score<l.r[0].score) {
55         printf("\nhigh为%d\n",high);
56         low++;}
57         l.r[high]=l.r[low];
58     }
59     l.r[low]=l.r[0];
60     return low;
61 }
62
63 /*
64     Name: 启动递归快速排序
65     Copyright: http://www.cnblogs.com/gangtiexia
66     Author: 钢铁侠
67     Date: 11-12-15 14:37
68     Description: 启动递归快速排序,并进行第一个大部分(所有记录)的快速排序
69 */
70
71 Status QuickSort(SqList &l,int low,int high){
72     int pivotloc;
73     if(low<high){
74         pivotloc=partition(l,low,high);
75         QuickSort(l,low,pivotloc-1);
76         QuickSort(l,pivotloc+1,high);
77     }
78     return OK;
79 }
80
81 Status Traverse(SqList &l){
82     for(int i=1;i<=MAXSIZE;i++)
83     {
84         printf("%s的分数为%d \n",l.r[i].name,l.r[i].score);
85     }
86 }
87
88 int main(){
89
90     SqList L;
91     initSqList(L);
92     printf("L.length为%d",L.length);
93     QuickSort(L,1,L.length);
94     Traverse(L);
95     return 0;
96 }
时间: 2024-10-26 15:13:30

快速排序(Quick Sort)的C语言实现的相关文章

经典排序算法 - 快速排序Quick sort

经典排序算法 - 快速排序Quick sort 原理,通过一趟扫描将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列 举个例子 如无序数组[6 2 4 1 5 9] a),先把第一项[6]取出来, 用[6]依次与其余项进行比较, 如果比[6]小就放[6]前边,2 4 1 5都比[6]小,所以全部放到[6]前边 如果比[6]大就放[6]后边,9比[6]大,放到[6

排序算法之快速排序(Quick Sort) -- 适用于Leetcode 75 Sort Colors

Quick Sort使用了Divide and Concur的思想: 找一个基准数, 把小于基准数的数都放到基准数之前, 把大于基准数的数都放到基准数之后 Worst case: O(n^2) Average case: O(nlogN) 步骤: 初始的数组 Array a[]: 0 1 2 3 4 5 6 7 8 9 51 73 52 18 91 7 87 73 48 3 基准数: X = a[0] = 51 i 的值: i = 0 j 的值: j = 9 (a.length) Step 1:

深入解析快速排序(Quick Sort)

本文将对快速排序进行深入的分析和介绍.通过学习本文,您将 秒杀快速排序面试 掌握高效实现快排 加深范型编程意识 八卦花絮 快速排序是由图灵奖获得者.计算机语言设计大佬C. A. R. Hoare在他26岁时提出的.说起C. A. R. Hoare老爷爷,可能很多人的第一印象就是快速排序,但是快排仅仅是他人生中非常小的成就而已.例如,他在1978年提出的Communicating Sequential Processes(CSP)理论,则深深的影响了并行程序设计,Go语言中的Goroutine就是

算法---快速排序(quick sort)

在前面介绍的排序算法中,最快的排序算法为归并排序,但是归并排序有一个缺陷就是排序过程中需要O(N)的额外空间.本文介绍的快速排序算法时一种原地排序算法,所需的额外空间复杂度为O(1). 算法介绍:快速排序其实一种根据需找某个元素的具体位置进行排序的方法.比如所存在如下数组 选择第一个元素5,找到5最终的位置,即5的左边的数都小于或者等于5,右边的数都大于或者等于5. 从"6"开始,可知6大于5,此处停住,从"2"开始2小于5,因此交换6与2的位置,然后接着往下走,将

快速排序算法回顾 --冒泡排序Bubble Sort和快速排序Quick Sort(Python实现)

冒泡排序的过程是首先将第一个记录的关键字和第二个记录的关键字进行比较,若为逆序,则将两个记录交换,然后比较第二个记录和第三个记录的关键字.以此类推,直至第n-1个记录和第n个记录的关键字进行过比较为止.上述过程称为第一趟冒泡排序,接着第二趟对前面n-1个关键字进行同样操作,…… 快速排序是对冒泡排序的一种改进,通过一趟排序将记录分割成独立的两部分,其中一部分记录的关键字均比另一部分关键字小,可分别对这两部分记录以递归的方法继续进行排序,以达到整个序列有序. 单趟Partition()函数过程请看

排序算法 - 快速排序(Quick Sort)

算法思想 快速排序是C.R.A.Hoare于1962年提出的一种划分交换排序.它采用了一种分治的策略,通常称其为分治法(Divide-and-ConquerMethod). (1) 分治法的基本思想    分治法的基本思想是:将原问题分解为若干个规模更小但结构与原问题相似的子问题.递归地解这些子问题,然后将这些子问题的解组合为原问题的解. (2)快速排序的基本思想    设当前待排序的无序区为R[low..high],利用分治法可将快速排序的基本思想描述为:分解:      在R[low..hi

快速排序Quick sort(转)

原理,通过一趟扫描将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列 举个例子 如无序数组[6 2 4 1 5 9] a),先把第一项[6]取出来, 用[6]依次与其余项进行比较, 如果比[6]小就放[6]前边,2 4 1 5都比[6]小,所以全部放到[6]前边 如果比[6]大就放[6]后边,9比[6]大,放到[6]后边,//6出列后大喝一声,比我小的站前边,比

排序:快速排序Quick Sort

原理,通过一趟扫描将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列 举个例子 如无序数组[6 2 4 1 5 9] a),先把第一项[6]取出来, 用[6]依次与其余项进行比较, 如果比[6]小就放[6]前边,2 4 1 5都比[6]小,所以全部放到[6]前边 如果比[6]大就放[6]后边,9比[6]大,放到[6]后边,//6出列后大喝一声,比我小的站前边,比

基础算法之快速排序Quick Sort

原理 快速排序(Quicksort)是对冒泡排序的一种改进. 从数列中挑出一个元素,称为"基准"(pivot); 排序数列,所有元素比基准值小的摆放在基准前面,所有元素比基准值大的摆在基准的后面(相同的数可以到任一边).在本次排序退出之后,该基准就处于数列的中间位置.这个称为分区(partition)操作; 递归地(recursive)把小于基准值元素的子数列和大于基准值元素的子数列排序. 例子 将无序数组[3,6,4,2,5,1]进行快速排序 1),先把第一项[3]取出来作为基准依次