排序--快速排序算法
(第一轮)
第一步:设左边第一个元素34为基准元素base,拿出来放在一边,这样34的位置就空了出来
第二步:从最右边开始向左一个个地和base比较,当找到比base小的元素11,就把它放到34空出来的位置上,这样11的位置空了出来
第三步:从最左边开始向右一个个地和base比较,当找到比base大的元素77,就把它放到11空出来的位置上,这样77的位置空了出来
第四步:又从最右边开始向左一个个地和base比较,当找到比base小的元素9,就把它放到77空出来的位置上,这样9的位置空了出来
第五步:又从最左边开始向左一个个地和base比较,当找到元素9的位置时还是找到不比base大的,就把base(34)放在元素9的位置上,现在base(34)的左边都是比它小的元素,右边都是比它大的元素,这样base(34)的位置就可以确定了,位置下标为7
(第二轮)
把上一轮找出的位置下标7左边的所有元素分为一新的数组,右边的也分为新的一组,分别重复第一轮的步骤
(......)每重复一轮可以确定一个元素的具体位置,直到所有元素都确定好位置
平均时间复杂度为:O(N*LogN)
最差时间复杂度为:O(N^2)
是否稳定:不稳定
C++代码如下:
#include "stdafx.h"
using namespace System;
int Division(int a[],int left,int right)
{
int base=a[left];
while(left<right)
{
while(left < right && a[right]>base)
{
right--;
}
a[left]=a[right];
while(left < right && a[left]<base)
{
left++;
}
a[right]=a[left];
}
a[left]=base;
return left;
}
//快速排序
void Quick(int a[],int left,int right)
{
int i,j;
if(left<right)
{
i = Division(a,left,right);
Quick(a,left,i-1);
Quick(a,i+1,right);
}
}
int main(array<System::String ^> ^args)
{
int i,a[10]={34,2,77,23,1,5,7,9,11,44};
Console::WriteLine("sort before:");
for(i=0;i<10;i++)
{
Console::Write(a[i]+ " | ");
}
Console::WriteLine("\n");
Quick(a,0,9);
Console::WriteLine("sort after:");
for(i=0;i<10;i++)
{
Console::Write(a[i]+ " | ");
}
Console::ReadLine();
return 0;
}