快速排序:(假设从小到大)
基本思想:
(1)选取一个基准数(本例为选取数组第start个元素),然后遍历数组,把小于基准数的放到数组的前面,大于基准数的放到数组的后边;
(2)将基准数与(从后边数)第一个小于等于基准数交换,这样基准数的前面都小于基准数,基准数的后边都大于基准数;
(3)然后递归调用本身,完成排序;
时间复杂度:o(nlogn)
空间复杂度:原地排序o(1)
适用情况:快速排序是目前基于比较的内部排序中被认为是最好的方法,当待排序的序列是随机分布时,快排的平均时间最短。
实现代码(c语言)
基本思想:
(1)选取一个基准数(本例为选取数组第start个元素),然后遍历数组,把小于基准数的放到数组的前面,大于基准数的放到数组的后边;
(2)将基准数与(从后边数)第一个小于等于基准数交换,这样基准数的前面都小于基准数,基准数的后边都大于基准数;
(3)然后递归调用本身,完成排序;
时间复杂度:o(nlogn)
空间复杂度:原地排序o(1)
适用情况:快速排序是目前基于比较的内部排序中被认为是最好的方法,当待排序的序列是随机分布时,快排的平均时间最短。
实现代码(c语言)
#include<stdio.h>
#include<stdlib.h>
int partion(int a[],int start,int end)
{
int i,j,temp,base;
base=a[start];
j=end;
for(i=end;i>start;i--)
{
if(a[i]>base)
{
temp=a[i];
a[i]=a[j];
a[j]=temp;
j--;
}
}
temp=a[j];
a[j]=a[start];
a[start]=temp;
return j;
}
void quicksort(int a[],int start,int end)
{
int p;
if(start<end)
{
p=partion(a,start,end);
quicksort(a,start,p-1);
quicksort(a,p+1,end);
}
}
int main()
{
int a[]={4,5,3,2,7,6};
int i;
for(i=0;i<6;i++)
printf("%d",a[i]);
printf("\n");
quicksort(a,0,5);
for(i=0;i<6;i++)
printf("%d",a[i]);
printf("\n");
return 0;
}