快速排序的最大优点能对乱序做做大幅度调整,比较适合于乱序的集合。
像类似于冒泡和沉底的排序方法,每次都把最大或最小值放入目标位置,也就是说,但数据构造有序,且顺序与冒泡方向相反时,就悲剧了。快速排序则是把任意值放入目标位置,所以对于乱序比较适合。
算法步骤:
1.根据序列第一个数作为两个序列划分界限,小于的在左边,大于的在右边
2.递归划分左边和右边。
第一步:
划分数组。
int Partition(int* pSrc, int iLow, int iHigh) { //用来划分的数也就是界限值 int temp = *(pSrc + iLow); int iFirst = iLow; int iLast = iHigh; while(iFirst < iLast) { while((iFirst < iLast)&&(*(pSrc+iLast) >= temp))
iLast --; //找到右边第一个小于界限值
while((iFirst < iLast) &&(*(pSrc + iFirst) < temp)) iFirst++; //找到左边第一个大于界限的值
if(iFirst < iLast) { *(pSrc + iLast) = *(pSrc + iFirst); //和上次右边值替换 iLast --; }
}
} *(pSrc + iFirst) = temp; //结束之后把界限值放好 return iFirst;} 集合划分好了,下面就是递归求解左边和右边的集合了。
void QuickSort(int* pSrc, int iLow, int iHigh) { if(iLow > iHigh) return ; //递归的第一要素,终止条件。 int imid = Partition(pSrc,iLow,iHigh); //一次划分结果 QuickSort(pSrc,iLow,imid-1); //左边集合递归求解 QuickSort(pSrc,imid + 1,iHigh); //右边集合递归求解 }
源码#include "stdafx.h" #include <iostream> using namespace std; void QuickSort(int* pSrc, int iLow, int iHigh); int FindMid(int *pSrc, int iLow, int iHigh, int iMin); int _tmain(int argc, _TCHAR* argv[]) { int a[7] = {1,5,6,7,3,2,4}; cout<<"排序前:"; for(int i = 0; i < 7;i++) cout<<a[i]; cout<<endl; QuickSort(a,0,6); cout<<"排序后: "; for(int i = 0; i < 7;i++) cout<<a[i]; cout<<endl; return 0; } //一次划分 int Partition(int* pSrc, int iLow, int iHigh) { int temp = *(pSrc + iLow); int iFirst = iLow; int iLast = iHigh; while(iFirst < iLast) { while((iFirst < iLast)&&(*(pSrc+iLast) >= temp)) iLast --; if(iFirst < iLast) { *(pSrc + iFirst) = *(pSrc + iLast); iFirst++; } while((iFirst < iLast) &&(*(pSrc + iFirst) < temp)) iFirst++; if(iFirst < iLast) { *(pSrc + iLast) = *(pSrc + iFirst); iLast --; } *(pSrc + iFirst) = temp; } return iFirst; } void QuickSort(int* pSrc, int iLow, int iHigh) { if(iLow > iHigh) return ; int imid = Partition(pSrc,iLow,iHigh); QuickSort(pSrc,iLow,imid-1); QuickSort(pSrc,imid + 1,iHigh); }