快速排序的最大优点能对乱序做做大幅度调整,比较适合于乱序的集合。
像类似于冒泡和沉底的排序方法,每次都把最大或最小值放入目标位置,也就是说,但数据构造有序,且顺序与冒泡方向相反时,就悲剧了。快速排序则是把任意值放入目标位置,所以对于乱序比较适合。
算法步骤:
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);
}