快排还是看之前的那篇博客吧,这个写的不实用
基于《数据结构与算法分析》182页,写的快速排序。对于枢纽元的选择使用三数中值分割法。
#include<iostream>
#include<vector>
#define cutOff 3
using namespace std;
int Media3(vector<int>& vecUnsort, int left, int right)
{
int center = (left + right) / 2;
if (vecUnsort[left] > vecUnsort[center])
swap(vecUnsort[left], vecUnsort[center]);
if (vecUnsort[left] > vecUnsort[right])
swap(vecUnsort[left], vecUnsort[right]);
if (vecUnsort[center] > vecUnsort[right])
swap(vecUnsort[center], vecUnsort[right]);
swap(vecUnsort[center], vecUnsort[right - 1]);
return vecUnsort[right - 1];
}
void InsertSort(vector<int>& vecUnsort, int left, int length)
{
int i, j;
int temp;
for (i = 1 + left; i < length + left; ++i)
{
temp = vecUnsort[i];
for (j = i - 1; j >= left && temp < vecUnsort[j]; --j)
{
vecUnsort[j + 1] = vecUnsort[j];
}
vecUnsort[j + 1] = temp;
}
}
void QSort(vector<int>& vecUnsort, int left, int right)
{
int i, j;
int Pivot;
if (left + cutOff <= right)
{
Pivot = Media3(vecUnsort, left, right);
i = left;
j = right - 1;
while (true)
{
while (vecUnsort[++i] < Pivot);
while (vecUnsort[--j] > Pivot);
if (i < j)
swap(vecUnsort[i], vecUnsort[j]);
else
break;
}
swap(vecUnsort[i], vecUnsort[right - 1]);
QSort(vecUnsort, left, i - 1);
QSort(vecUnsort, i + 1, right);
}
else
{
InsertSort(vecUnsort, left, right - left + 1);
}
}