快速排序
快速排序用了递归的方法来排序
把待排序数据分为两部分进行排序,按升序或是降序将两边数据放置后,继续二分进行排序.
排序过程
假设有这么一组数据a:
10 23 5 6 89 8 设左值i = 0 j = 5 寻找过程中若i >= j就进入下一层排序
将10设为key 从右边开始寻找比10大的数据 找到了89 此时i = 0,j = 4;
89赋给a[i]后: 89 23 5 6 89 8
从左边开始寻找比10小的数据 找到了5 此时i = 2,j = 4
5赋给a[j]后: 89 23 5 6 5 8
从右边开始寻找比10大的数据 发现找不到满足i < j的情况下大于10的数据
把数据89 23 5 6 5 8分成 89 12 和 5 6 5 8两部分,分别对这两部分重复上述排序
最后得到89 23 10 8 6 5的降序排序数据.
排序实现代码
注:参考了百度百科的实现
不一样的地方在于:百科的示例代码只会讲和key值比较的值移到另一边
而我希望和key比较的值移动到另一边后 交换这两个值
虽然不交换数值也不会错 但从逻辑角度上说 两个节点交换不应该只赋值而不交换
void swap(int *a, int *b) {
int tmp
tmp = *a
*a = *b
*b = tmp
}
void quick_sort(int *a, int left, int right) {
if (left >= right) {
return
}
int i = left
int j = right
int key = a[i]
while (i < j) {
while (i < j && key >= a[j]) {
j--
}
swap(&a[i], &a[j])
//a[i] = a[j]
while (i < j && key <= a[i]) {
i++
}
swap(&a[j], &a[i])
//a[j] = a[i]
}
a[i] = key
quick_sort(a, left, i - 1)
quick_sort(a, i + 1, right)
}
代码及单元测试实现
https://github.com/sliver-chen/codingutil/tree/master/algorithm/quick_sort