#include <stdio.h>
/*
快速排序描述:
1.从数列中挑出一个元素,称为 "基准"(pid)
2.重新排序数列,所有元素比基准值小的摆放在基准前面,所有元素比基准值大的摆在基准的后面(相同的数可以到任一边)。
在这个分区退出之后,该基准就处于数列的中间位置。这个称为分区(partition)操作。
3.递归地(recursive)把小于基准值元素的子数列和大于基准值元素的子数列排序。
示例代码:示例代码为C语言,输入参数中,需要排序的数组为arr[],取出一个元素为pivot,并根据 pivot值,
将数组按照大于pivot和小于pivot分为两个区域,递归完成排序。
算法分析:
最差时间复杂度 Θ(n2) 最优时间复杂度 Θ(nlog n) 平均时间复杂度 Θ(nlog n)。
原理:
已知一组无序数据a[1]、a[2]、……a[n],需将其按升序排列。首先任取数据a[x]作为基准。比较a[x]与其它数据并排序,
使a[x]排在数据的第k位,并且使a[1]~a[k-1]中的每一个数据<a[x],a[k+1]~a[n]中的每一个数据>a[x],然后采用分治的
策略分别对a[1]~a[k-1]和a[k+1]~a[n]两组数据进行快速排序。
优劣:
优点:极快,数据移动少;缺点:不稳定。
*/
//快速排序
//参数说明:a是要排序的数组,begin是要排序数组的开始位置,end数组结束下标。
void Quick_sort(unsigned char *a,unsigned char begin,unsigned char end)
{
unsigned char pid,i,j;
pid=a[begin];
i=begin;
j=end;
while(i<j) //完成比pid大的在pid右边,比pid小的在pid左边
{
while( (i<j)&&(a[j]>pid) )
j--;
a[i]=a[j];
while( (i<j)&&(a[i]<=pid) )
i++;
a[j]=a[i];
}
a[i]=pid;
//递归调用左半部数组部分
if((i-1)>begin)
Quick_sort(a, begin,i-1);
//递归调用右半部数组部分
if(end>(i+1))
Quick_sort(a, i+1,end);
}
void main()
{
unsigned char i;
unsigned char aa[20]={14,13,34,54,67,34,21,4,5,90,76,23,11,10,7,8,56,40,16,4};
Quick_sort(aa,0,19);
for(i=0;i<20;i++)
printf("%d\n",aa[i]);
}
/*
快速排序描述:
1.从数列中挑出一个元素,称为 "基准"(pid)
2.重新排序数列,所有元素比基准值小的摆放在基准前面,所有元素比基准值大的摆在基准的后面(相同的数可以到任一边)。
在这个分区退出之后,该基准就处于数列的中间位置。这个称为分区(partition)操作。
3.递归地(recursive)把小于基准值元素的子数列和大于基准值元素的子数列排序。
示例代码:示例代码为C语言,输入参数中,需要排序的数组为arr[],取出一个元素为pivot,并根据 pivot值,
将数组按照大于pivot和小于pivot分为两个区域,递归完成排序。
算法分析:
最差时间复杂度 Θ(n2) 最优时间复杂度 Θ(nlog n) 平均时间复杂度 Θ(nlog n)。
原理:
已知一组无序数据a[1]、a[2]、……a[n],需将其按升序排列。首先任取数据a[x]作为基准。比较a[x]与其它数据并排序,
使a[x]排在数据的第k位,并且使a[1]~a[k-1]中的每一个数据<a[x],a[k+1]~a[n]中的每一个数据>a[x],然后采用分治的
策略分别对a[1]~a[k-1]和a[k+1]~a[n]两组数据进行快速排序。
优劣:
优点:极快,数据移动少;缺点:不稳定。
*/
//快速排序
//参数说明:a是要排序的数组,begin是要排序数组的开始位置,end数组结束下标。
void Quick_sort(unsigned char *a,unsigned char begin,unsigned char end)
{
unsigned char pid,i,j;
pid=a[begin];
i=begin;
j=end;
while(i<j) //完成比pid大的在pid右边,比pid小的在pid左边
{
while( (i<j)&&(a[j]>pid) )
j--;
a[i]=a[j];
while( (i<j)&&(a[i]<=pid) )
i++;
a[j]=a[i];
}
a[i]=pid;
//递归调用左半部数组部分
if((i-1)>begin)
Quick_sort(a, begin,i-1);
//递归调用右半部数组部分
if(end>(i+1))
Quick_sort(a, i+1,end);
}
void main()
{
unsigned char i;
unsigned char aa[20]={14,13,34,54,67,34,21,4,5,90,76,23,11,10,7,8,56,40,16,4};
Quick_sort(aa,0,19);
for(i=0;i<20;i++)
printf("%d\n",aa[i]);
}