快排还是看之前的那篇博客吧,这个写的不实用
基于《数据结构与算法分析》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 );
}
}