基本思想:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有的数据都比另外一部分的所有的数据小,然后再按此方法对这两部分数据分别进行快速排序,以此达到整个数据变成有序序列。
b:2 7 1 8 5 6 4 //从左至右,swap(8,3),主元为3,left = 1
c:2 1 7 8 5 6 4 //从右至左,swap(1,3),主元为3,right =3
e:2 1 3 7 8 5 6 4 //riight =2; right ==left,将a[left]==3
// QuickSort2.cpp : 定义控制台应用程序的入口点。 // #include "stdafx.h" #include <iostream>
int Divition(int a[],int left,int right) { int base; base = a[left]; while (left<right) { while(left<right && a[right]>base) { --right; } a[left]=a[right]; while(left<right && a[left]<base) { ++left; } a[right]=a[left]; } a[left]=base; return left; } void QucikSort(int a[],int left,int right) { int i=0; //if 进行一次逻辑判断,根据判断逻辑结果决定是否操作; //while 进行一系列循环操作,可能执行 N 次 ... if(left<right)//注意此处不能用while { i=Divition(a,left,right); QucikSort(a,left,i-1); QucikSort(a,i+1,right); } } int _tmain(int argc, _TCHAR* argv[]) { int a[]={2,1,4,3,6}; QucikSort(a,0,4); for (int i=0;i<5;i++) { printf("%3d ",a[i]); } system("pause"); return 0; }
转载自:http://blog.csdn.net/feixiaoxing/article/details/6845132
- 首先判断输入参数的有效性
- 把数组的第一个数据作为比较的原点,比该数据小的数据排列在左边,比该数据大的数据排列在右边
- 按照2的方法分别对左边的数组合右边的数据进行和2一样的数据排列
分析:
start end
0 1 2 3 4 5 6 7
3 8 7 1 2 5 6 4 value=3,length =8,loop=1;front=0;tail=7;
_ 8 gQuickSort[7]=8;tail =6;loop=2;
3 8 7 1 2 5 6 4
_ 7 8 gQuickSort[6]=7;tail =5;loop=3;
3 8 7 1 2 5 6 4
1 7 8 gQuickSort[0]=7;front =1;loop=4;
3 8 7 1 2 5 6 4
1 2 7 8 gQuickSort[0]=7;front =2;loop=5;
·······
1 2 3 4 5 6 7 8 front ==tail =2&&loop>end
int get_middle(int array[], int start, int end) { int front = 0; int tail = end - start; int value = array[start]; int length = end - start + 1; int loop = start + 1; while(loop <= end){ if(array[loop] < value){ gQuickSort[front] = array[loop]; front ++; }else{ gQuickSort[tail] = array[loop]; tail --; } loop ++; } gQuickSort[front] = value; memmove(&array[start], gQuickSort, sizeof(int) * (length)); return start + front ; }
void _quick_sort(int array[], int start, int end) { int middle; if(start >= end) return; middle = get_middle(array, start, end); _quick_sort(array, start, middle -1); _quick_sort(array, middle + 1, end); } void quick_sort(int array[], int length) { int median = 0; if(NULL == array || 0 == length) return; _quick_sort(array, 0, length-1); }