//
QickSubQickSort.cpp: 主项目文件。
#include
"
stdafx.h
"
#include <iostream>
using
namespace std;
void QickSort(
int arr[],
int iLength);
int SubQickSort(
int arr[],
int iCurentIndex,
int iLength);
void Swap(
int& a,
int& b);
int main()
{
const
int iLength =
10;
int arr[iLength] = {
3,
0,
1,
8,
7,
2,
5,
4,
9,
6};
//
快速排序
QickSort(arr, iLength);
for(
int i =
0; i < iLength; ++i)
{
cout << arr[i] <<
"
\t
";
}
system(
"
pause
");
return
0;
}
void QickSort(
int arr[],
int iLength)
{
int iStart =
0, iEnd = iLength -
1;
int* arrSubQickSorted =
new
int[iLength];
//
已经排好的位置 如果已排好, 对应元素设置为1
memset(arrSubQickSorted,
0,
sizeof(
int) * iLength);
while(
true)
{
bool hasFindStart =
false, hasFindEnd =
false;
//
for循环是找出前端与末端的
for(
int i =
0; i < iLength; ++i)
{
if(arrSubQickSorted[i] ==
0)
{
if(hasFindStart ==
false)
{
iStart = i;
hasFindStart =
true;
}
else
if(hasFindStart
//
已有前端
&& ((i +
1 < iLength && arrSubQickSorted[i +
1] ==
1)
//
末端后一位是1值, 当前位是0值
|| (i +
1 == iLength)))
//
末端后一位已经到最后了
{
iEnd = i;
hasFindEnd =
true;
break;
}
}
}
if(hasFindStart && hasFindEnd)
//
前到前端与后端, 则逼近pivot排序; 如果只有前端之类说明已经排好了
{
int iPivotPos = SubQickSort(arr, iStart, iEnd);
arrSubQickSorted[iPivotPos] =
1;
}
else
break;
}
delete []arrSubQickSorted;
//
如果直接删除指针是只删除第一个元素
}
//
以iStart为基础元素, 粗排一次, 返回基准元素所在的位置
int SubQickSort(
int arr[],
int iStart,
int iEnd)
{
//
以第一个元素为基准 小的放他左边, 大的放他右边
//
遍历时是向基准元素逼进
int iPivotPos = iStart;
for(
int i = iEnd; i != iPivotPos;)
{
//
如果第i个数据比pivot小并且在pivot的右边, 那么交换数据, 交换下i和pivotPost
//
如果第i个数据比pivot大并且在pivot左边, 交换
if((arr[i] < arr[iPivotPos] && i > iPivotPos) || (arr[i] > arr[iPivotPos] && i < iPivotPos) )
{
Swap(arr[i], arr[iPivotPos]);
Swap(iPivotPos, i);
}
if(i == iPivotPos)
break;
else
if(i > iPivotPos)
--i;
else
++i;
}
return iPivotPos;
}
void Swap(
int& a,
int& b)
{
int c = a;
a = b;
a = c;
}
自己拼接出来的. 可以在博客园里里面搜索快速排序算法, 比我这个要好.
参考: