标签:
基本思想:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有的数据都比另外一部分的所有的数据小,然后再按此方法对这两部分数据分别进行快速排序,以此达到整个数据变成有序序列。
// 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
分析:
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); }
标签:
原文地址:http://www.cnblogs.com/lwflourish/p/4491136.html