赞
踩
需要强调的是,对于和基准值相等的序列元素,其在基准值左边或右边的子序列都没有关系。
i
作为分界点,则不能以序列最左边的元素作为基准值;如果以j
作为分界点,则不能以序列最右边的元素作为初始值。下面通过一个简单的案例介绍快速排序算法的过程。案例如下:
2 3 4 1
2
的左边;右指针指向序列的右边界,即1
的右边。本例中以序列的第一个元素2
作为基准值。2
不满足小于基准值2
,因此停下。1
不满足大于基准值2
,因此停下。1 3 4 2
3
,发现该元素也不满足大于基准值2
,因此停下。4
,发现该元素满足大于基准值2
,因此继续向左移动,发现元素3
也满足大于基准值2
,因此继续向左移动指向元素1
,由于1
不满足大于基准值2
,因此右指针停下。(1)
和(3 4 2)
。分别递归地对左右子序列进行快速排序。1
,属于递归基,因此无需排序。(2 3 4)
。(1 2 3 4)
。#include<iostream> #include<algorithm> using namespace std; const int N = 100010; int a[N]; int n; void quick_sort(int* a, const int& left, const int& right) { if (left >= right)return; int i(left - 1), j(right + 1), ref(a[(left+right)>>1]); while (i < j) { do i++; while (a[i] < ref); do j--; while (a[j] > ref); if (i < j)swap(a[i], a[j]); } //下面的递归调用部分,如果采用下面的写法,则基准值不能取原始序列的最左侧元素 //因为i-1可能取值-1,导致数组越界 quick_sort(a, left, i-1); quick_sort(a, i, right); } int main(void) { cin >> n; for (int i(0); i < n; ++i) cin>> a[i]; quick_sort(a, 0, n - 1); for (int i(0); i < n; ++i) printf("%d ", a[i]); return 0; }
注意事项:
swap
函数是C++的<algorithm>
头文件中提供的函数,用于交换两个变量的值,使用时需要导入头文件。scanf
函数进行输入,此处由于输入规模不大,故才使用cin
进行输入。sort
是C++的STL中自带的排序函数,可以按照从小到大的顺序对一个向量等容器中的元素进行排序。使用语法为:sort(容器变量名.begin(),容器变量名.end())
。Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。