Implementation: Quick Sort 2014-08-19

 1 #include <stdio.h>
 2
 3 void print(int *a, int start , int end);
 4
 5 void quick_sort(int *a, int start, int end) {
 6     if (start + 1 >= end) return;
 7     int pv = a[start];
 8     int p = start, q = end;
 9     for (;;) {
10         while (++p < end   && a[p] < pv);
11         while (--q > start && a[q] > pv);
12         if (p > q) {
13             break;
14         }
15         int t = a[p];
16         a[p] = a[q];
17         a[q] = t;
18     }
19
20     a[start] = a[p-1];
21     a[p-1] = pv;
22
23     // print(a, start, end);
24
25     quick_sort(a, start, p-1);
26     quick_sort(a, p, end);
27 }
28
29 void print(int *a, int start , int end) {
30     for (int i=start; i<end; i++) {
31         printf("%d ", a[i]);
32     }
33     printf("\n");
34 }
35
36 int main() {
37     int a[] = {2};
38
39     int len = sizeof(a) / sizeof(int);
40     quick_sort(a, 0, len);
41
42     for (int i=0; i<len; i++) {
43         printf("%d ", a[i]);
44     }
45     return 0;
46 }

快排还是很容易写错的,记得编程珠玑上说,在提出后的十几年时间少有正确的实现,不断尝试感觉这个实现可以作为自己的模板了,或许可以再加上一个随机化选择的过程。

函数对a[start, end)范围内的数进行一个非降序排序,这个界限划分符合STL的习惯,发现这种半开区间的表示方法确实非常好用

先选取a[start]作为一个哨兵,对剩下的a(start, end)范围内数进行一个比较交换工作,这样从前到后和从后到前的过程就对称了(现在都是开边界了)

设 p = start, q=end为初始状态

在交换过程中

while (++p < end && a[p] < pv);
while (--q > start && a[q] > pv);

首先对下标进行一个自增/自减,这里每次检测都进行这个过程(即使&&后面的条件不满足,防止两个下标在等值处不能移动造成死循环)

当退出循环时,可以确定p指向的是第一个比哨兵值(a[start])大的元素的下标(有可能这个下标是end,但我们不会直接用它来取值,所以没关系),因而a[p-1]肯定比哨兵值来的小,于是把哨兵值和a[p-1]做一个交换。此时原来的数组已经以a[p-1]为界限被划分成了两部分,a[start, p-1) < a[p-1] < a[p, end)。这样进行一个递归调用即可。

quick_sort(a, start, p-1);
quick_sort(a, p, end);

Implementation: Quick Sort 2014-08-19

时间: 2024-10-25 18:00:51

Implementation: Quick Sort 2014-08-19的相关文章

0000pt; margin-bot《怎样才能不得病》黄帝内经系列-2014.5.19群分享-健康养生

   2014/5/19 10:08:06 是以志闲而少欲,心安而不惧,形劳而不倦,气从以顺,各从其欲,皆得所愿. 人身体的汗是心血的变现.由于心主血脉,血全身无处不有,汗水也可能全身都出.所以中国古人的锻炼原则是"形劳而不倦",再怎么活动也不能让人体超负荷地去运转,所以不可以大汗淋漓.   小孩为什么爱吃糖?大家知道吗?    2014/5/19 10:08:06 "少欲"就是人不要有过多的欲望,要让所有的欲望有一个界限,这样就能做到"心安而不惧&quo

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

快速排序(Quick Sort)的基本思想是通过一趟排序将待排记录分割成独立的两部分,其中一部分记录的关键字均比另一部分记录的关键字小,则可分别对着两部分记录继续进行排序,以达到整个序列有序,具体步骤为 设立枢轴,将比枢轴小的记录移到低端,比枢轴大的记录移到高端,直到low=high停止 分别对枢轴低高端部分再次快速排序(即重复第1步) 重复第1.2步,直到low=high停止 C语言实现(编译器Dev-c++5.4.0,源代码后缀.cpp) 原创文章,转载请注明来自钢铁侠Mac博客http:/

Quick Sort

(referrence: GeeksforGeeks) Like Merge Sort, Quick Sort is also a divide & conquer problem. It picks an element as pivot and partitions the given array around the picked pivot. Different versions of Picking pivot 1. Always pick first element as pivot

1101. Quick Sort (25)

There is a classical process named partition in the famous quick sort algorithm. In this process we typically choose one element as the pivot. Then the elements less than the pivot are moved to its left and those larger than the pivot to its right. G

pat1101. Quick Sort (25)

1101. Quick Sort (25) 时间限制 200 ms 内存限制 65536 kB 代码长度限制 16000 B 判题程序 Standard 作者 CAO, Peng There is a classical process named partition in the famous quick sort algorithm. In this process we typically choose one element as the pivot. Then the elements

笔试算法题(54):快速排序实现之单向扫描、双向扫描(single-direction scanning, bidirectional scanning of Quick Sort)

议题:快速排序实现之一(单向遍历) 分析: 算法原理:主要由两部分组成,一部分是递归部分QuickSort,它将调用partition进行划分,并取得划分元素P,然后分别对P之前的部分和P 之后的部分递归调用QuickSort:另一部分是partition,选取划分元素P(随机选取数组中的一个元素,交换到数组末尾位置),定义两个标记 值left和right,随着划分的进行,这两个标记值将数组分成三部分,left之左的部分是小于划分元素P的值,left和right之间的部分是大 于等于划分元素P的

排序算法之快速排序(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:

笔试算法题(55):快速排序实现之非递归实现,最小k值选择(non-recursive version, Minimal Kth Selection of Quick Sort)

议题:快速排序实现之五(非递归实现,短序列优先处理,减少递归栈大小) 分析: 算法原理:此算法实现适用于系统栈空间不足够快速排序递归调用的需求,从而使用非递归实现快速排序算法:使用显示下推栈存储快速排序中的每一次划分结果 (将left和right都压入堆栈),并且首先处理划分序列较短的子序列(也就是在得到一次划分的左右部分时,首先将长序列入栈,然后让段序列入栈), 这样可以保证当快速排序退化的线性效率的时候,栈大小仍旧在㏒N范围内.算法策略类似于最小子树优先遍历规则: 弱势:当序列已经就绪,每次

Collection of algorithm for sorting. 常见排序算法集(三) —— Quick Sort

Quick Sort 快排,一个排序方法能直接享受这样的名称殊荣,呵呵,可见其威力与重要性. 其中最重要的思想就是 "分治"-- divide and conquer ! 这里排序用到的思想极其简单,却是很实用的!小孩子都会的简单想法. 先把所有数据分成三个部分. 在所有数据中选取某一元素X,比X小的放左边,比X大的放右边. 接着把这一思想同样分别施加在X元素的左边和右边部分,同样继续划分,选出一个元素X' 比X'小的放左边比X'大的放右边. 继续施加这种划分策略,直到划分的元素很少(