赞
踩
思路
数组排序任务可以如下完成:
1)设k=a[0], 将k挪到适当位置,使得比k小的元素都
在k左边,比k大的元素都在k右边,和k相等的,不关心
在k左右出现均可 (O(n)时间完成)
2) 把k左边的部分快速排序
3) 把k右边的部分快速排序
图解
一组数据:
7 | 1 | 3 | 8 | 12 | 11 | 2 | 9 |
---|
首先 左指针为i,右边的指针为j,中间值为a[0]=7;
然后,左边的让着右边的,右边j向左移动,如下图
发现2比7小停止移动了,所以2和7就进行调换
这时候右边的调换一次了,总不能一直让右边移动,太累了,这时候左边开始移动了,但是他发现1比7小就没停,继续移动
发现3比7还是小,就继续移动,一直移动到8停下来了
8比7大,所以8和7进行了调换
这时候,右边开始移动,发现11,12都比7大所以,没有调换,最后ij都移动到了7的位置,他们俩相遇了,就停止了
对左右两边进行递归,就会得到有序的数组了
代码:
#include <iostream> using namespace std; void swap(int& a, int& b) //交换变量a,b值 { int tmp = a; a = b; b = tmp; } void QuickSort(int a[], int s, int e) { if (s >= e)//相当于左指针跑到右指针右边了,必然就停止了 return; int k = a[s];//以a[s],即左边第一个数为中间值 int i = s, j = e; while (i != j) { while (j > i&& a[j] > k)//找不到比中间值小的就一直走 --j; swap(a[i], a[j]);//找到了,进行交换 while (i < j && a[i] <= k)//找不到比中间值大的就一直走 ++i; swap(a[i], a[j]);//找到了,交换 }//处理完后,a[i]=k; QuickSort(a, s, i - 1);//对左右两边递归,得到 QuickSort(a, i + 1, e); } int a[] = { 93,27,30,2,8,12,2,8,30,89 }; int main() { int size = sizeof(a) / sizeof(int); QuickSort(a, 0, size - 1); for (int i = 0; i < size; ++i) cout << a[i] << ","; cout << endl; return 0; } }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。