// QickSort.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;
b = c;
}
#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;
b = c;
}
自己拼接出来的. 可以在博客园里里面搜索快速排序算法, 比我这个要好.
参考: