快速排序(Quick Sort)也是一种交换排序,它在排序中采取了分治策略。
void QuickSort(int a[], int n) //快速排序,版本一
{
if (a && n > 1)
{
int i, j, pivot; //pivot轴值
i=0, j = n - 1;
pivot = a[0]; //第一个元素为轴值
while (i < j)
{
while (i < j && a[j] >= pivot)
j--;
if (i < j)
a[i++]=a[j];
while (i < j && a[i] <= pivot)
i++;
if (i < j)
a[j--]=a[i];
}
a[i] = pivot; //把轴值放到分割处
QuickSort(a, i);
QuickSort(a + i + 1, n - i -1);
}
} void QuickSort(int a[], int n)
{
if (a && n > 1)
{
int i, j, pivot; //pivot轴值
i = 0, j = n - 1;
pivot = a[j]; //最后一个元素为轴值
while (i < j)
{
while (i < j && a[i] <= pivot)
i++;
if (i < j)
a[j--] = a[i];
while (i < j && a[j] >= pivot)
j--;
if (i < j)
a[i++] = a[j];
}
a[i] = pivot; //把轴值放到分割处
QuickSort(a, i);
QuickSort(a + i + 1, n - i - 1);
}
}
随机选取序列中一元素为轴值。
int SelectPivot(int a[], int low, int high)
{
int size = high - low + 1;
return a[low + rand()%size];
}选取首尾元素不就是该策略的一种特例!int SelectPivot(int a[], int low, int high)
{
int size = high - low + 1;
int p1, p2, p3;
p1 = low + rand()%size;
p2 = low + rand()%size;
p3 = low + rand()%size;
if ( a[p1] <= a[p2])
{
if (a[p1] >= a[p3]) a[p3]=<a[p1]<=a[p2]
return a[p1];
else
{
if (a[p2] <= a[p3])
return a[p2];
else
return a[p3];
}
}
else
{
if (a[p1] <= a[p3])
return a[p1];
else
{
if (a[p2] <= a[p3])
return a[p2];
else
return a[p3];
}
}
}它的一种特例就是,选取原序列首、尾、中间三数,取它们的中位数。int partition(int a[], int low, int high)
{
int i, j;
i = low - 1;
j = low;
while (j < high)
{
if (a[j] < a[high])
swap(a[++i], a[j]);
j++;
}
swap(a[++i], a[high]); //主元归位
return i; //上面一步已经 ++i,所以这里不用 i+1
}
void quicksort(int a[], int low, int high)
{
if (low < high) //至少两个元素,才进行排序
{
int i = partition(a, low, high);
quicksort(a, low, i - 1);
quicksort(a, i + 1, high);
}
}
void QuickSort(int a[], int n)
{
if (a && n>1)
quicksort(a, 0, n - 1);
}
int partition(int a[], int low, int high)
{
int i, j;
i = low; //这里与上一种的做法不同哦!
j = low;
while(j < high)
{
if (a[j] < a[high])
swap(a[i++], a[j]);
j++;
}
swap(a[i], a[high]); //主元归位
return i;
}int partition(int a[], int low, int high)
{
int i, j;
i = low;
j = low;
while (j <= high)
{
if (a[j] <= a[high])
swap(a[i++], a[j]);
j++;
}
return i;
}void QuickSort(int a[], int low, int high)
{
if (low < high)
{
stack<int> s; //使用STL中的栈
int l,mid,h;
mid = partition(a, low, high);
/*
首先存储第一次分割后的 [low, mid-1]和 [mid+1, high]
注意:这是成对存储的,取的时候注意顺序
*/
if (low < mid-1)
{
s.push(low);
s.push(mid - 1);
}
if (mid + 1 < high)
{
s.push(mid + 1);
s.push(high);
}
//只要栈不为空,说明仍有可分割的部分
while(!s.empty())
{
h=s.top();
s.pop();
l=s.top();
s.pop();
mid = partition(a, l, h);
if (l < mid - 1)
{
s.push(l);
s.push(mid - 1);
}
if (mid + 1 < h)
{
s.push(mid + 1);
s.push(h);
}
}
}
}原文:http://blog.csdn.net/zhangxiangdavaid/article/details/25436609