已知数组 src 如下:

[5, 3, 7, 6, 4, 1, 0, 2, 9, 10, 8]

快速排序1

在数组 src[low, high] 中,取 src[low] 作为 关键字(key)

通过 一趟快速排序 找到 key 的位置 keypos

keypos 将数组划分为两部分: src[low, keypos - 1]src[keypos + 1, high]

src[low, keypos - 1] 中的元素都 不大于 key

src[keypos + 1, high] 中的元素都 不小于 key

一趟快速排序 步骤如下:

1、定义两个指针 leftright , 初值为 lowhigh

2、定义关键字 key , 初值为 src[low]

3、 right 向前搜索,找到第 1 个 小于 key 的元素时,将 src[left]src[right] 互换。

4、 left 向后搜索,找到第 1 个 大于 key 的元素时,将 src[left]src[right] 互换。

5、 重复 3,4,直到 left = right 时结束。


快速排序2

通过上面的步骤可以发现,我们互换的数据有 1 个是关键字,但是关键字我们已经记录在 key 中,所以不需要将关键字不停的互换。只需要将另一个值移动即可。


快速排序2(C代码)

/*********************************************************************
Function: 快速排序2
Description:将数组src[low,high]升序排序
Parameters: src: 待排序数组
low: 起始下标
high: 结束下标
Return Value: 排序完成返回0,否则-1
Author: wowpH
Date: 2019-11-12 21:57:42
Reference: 数据结构(C语言版)严蔚敏 吴伟民 清华大学出版社
From: https://www.cnblogs.com/wowpH/p/11905926.html
*********************************************************************/
int quick_sort_two(int src[], int low, int high) {
if (low < 0 || low >= high) {
return -1;// 下标不合法
}
int key = src[low];// 将第1个作为关键字
int left = low;// 左边界
int right = high;// 右边界
while (left < right) {// 两端交替向中间扫描
// 在右边查找比关键字小的数据
while (left < right && src[right] >= key) {
--right;
}
src[left] = src[right];// 将比关键字小的移动到左边
// 在左边查找比关键字大的数据
while (left < right && src[left] <= key) {
++left;
}
src[right] = src[left];// 将比关键字大的移动到右边
}
src[left] = key;// 此时left就是一趟快速排序后的关键字所在的位置
quick_sort_two(src, low, left - 1);// 对左边的数据递归排序
quick_sort_two(src, left + 1, high);// 对右边的数据递归排序
return 0;
}

快速排序视频https://v.qq.com/x/page/w3021nsi4bi.html

原文链接https://www.cnblogs.com/wowpH/p/11905926.html


- End - wowpH - pfdvnah -

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

  1. [算法] 快速排序 Quick Sort

    快速排序(Quick Sort)使用分治法策略. 它的基本思想是:选择一个基准数,通过一趟排序将要排序的数据分割成独立的两部分:其中一部分的所有数据都比另外一部分的所有数据都要小.然后,再按此方法对这 ...

  2. 基础排序算法之快速排序(Quick Sort)

    快速排序(Quick Sort)同样是使用了分治法的思想,相比于其他的排序方法,它所用到的空间更少,因为其可以实现原地排序.同时如果随机选取中心枢(pivot),它也是一个随机算法.最重要的是,快速排 ...

  3. 快速排序Quick sort

    快速排序Quick sort 原理,通过一趟扫描将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归 ...

  4. Java中的经典算法之快速排序(Quick Sort)

    Java中的经典算法之快速排序(Quick Sort) 快速排序的思想 基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小, 然后再按此方法对 ...

  5. quicksort 快速排序 quick sort

    * Java基本版 package cn.mediamix; import java.util.LinkedList; public class QuickSort { public static v ...

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

    算法思想 快速排序是C.R.A.Hoare于1962年提出的一种划分交换排序.它采用了一种分治的策略,通常称其为分治法(Divide-and-ConquerMethod). (1) 分治法的基本思想  ...

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

    冒泡排序的过程是首先将第一个记录的关键字和第二个记录的关键字进行比较,若为逆序,则将两个记录交换,然后比较第二个记录和第三个记录的关键字.以此类推,直至第n-1个记录和第n个记录的关键字进行过比较为止 ...

  8. 基础算法之快速排序Quick Sort

    原理 快速排序(Quicksort)是对冒泡排序的一种改进. 从数列中挑出一个元素,称为"基准"(pivot); 排序数列,所有元素比基准值小的摆放在基准前面,所有元素比基准值大的 ...

  9. 快速排序——Quick Sort

    基本思想:(分治) 先从数列中取出一个数作为key值: 将比这个数小的数全部放在它的左边,大于或等于它的数全部放在它的右边: 对左右两个小数列重复第二步,直至各区间只有1个数. 辅助理解:挖坑填数 初 ...

  10. 排序:快速排序Quick Sort

    原理,通过一趟扫描将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序 ...

随机推荐

  1. ent 基本使用十九 事务处理

    ent 生成的代码中client 提供了比较全的事务处理 启动单个事务进行处理 // GenTx generates group of entities in a transaction. func ...

  2. 【CSP-S膜你考】即时战略(模拟)

    Problem B. 即时战略 (rts.c/cpp/pas) 注意 Input file: rts.in Output file: rts.out Time Limit : 2 seconds Me ...

  3. div模拟textarea且高度自适应

    需求 我们知道文本超出 textarea 高度后,textarea 就会出现滚动条,需求就是让 textarea 高度跟随文本高度变化,屏蔽滚动条,原来做过用js去监听文本行数,然后改变文本框的高度, ...

  4. Sherlock and His Girlfriend(信息学奥赛一本通 1623)

    [题目描述] 原题来自:Codeforces Round #400 B. Sherlock 有了一个新女友(这太不像他了!).情人节到了,他想送给女友一些珠宝当做礼物. 他买了 n 件珠宝.第 i 件 ...

  5. mac 使用tesseract识别图片中的中文

    安装 tesseractbrew install tesseract 加入环境变量export TESSDATA_PREFIX=/usr/local/Cellar/tesseract/4.1.0/sh ...

  6. Mac上安装Python3虚拟环境(VirtualEnv)教程

    如果已经安装好pip3,那么执行命令安装virtualenv环境 pip3 install virtualenv 安装完成检测版本是否安装成功 virtualenv --version 创建新目录 M ...

  7. shell 只读变量

    test.sh: #!/bin/bash myUrl="http://www.google.com" readonly myUrl myUrl="http://www.r ...

  8. SpringCloud-Feign声明式服务调用

    在前面的文章中可以发现当我们通过RestTemplate调用其它服务的API时,所需要的参数须在请求的URL中进行拼接,如果参数少的话或许我们还可以忍受,一旦有多个参数的话,这时拼接请求字符串就会效率 ...

  9. GCC编译UDF和gdb调试UDF

    Fluent版本:19.0 前面我们介绍过使用VS来编译和调试UDF,其实我们也可以用GCC来编译UDF.gdb调试UDF.本次介绍的方法更具有通用性,也适用于Linux下Fluent的UDF编译和调 ...

  10. hyper-v显示分辨率如何自动调整

    打开文件/etc/default/grub 找到GRUB_CMDLINE_LINUX_DEFAULT所在行,在最后加上 video=hyperv_fb:[分辨率],比如我想要的分辨率是1600×900 ...