已知数组 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、定义两个指针 left
和 right
, 初值为 low
和 high
。
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