快速排序

来源:互联网 发布:linux识别不到hba卡 编辑:程序博客网 时间:2024/05/17 12:46

快速排序算法

快速排序是由东尼?霍尔所发展的一种排序算法。在平均状况下,排序 n 个项目要Ο(n log n)次比较。在最坏状况下则需要Ο(n2)次比 较,但这种状况并不常见。事实上,快速排序通常明显比其他Ο(n log n)算法更快,因为它的内部循环(inner loop)可以在大部分的架构 上很有效率地被实现出来。

快速排序使用分治法(Divide and conquer)策略来把一个串行(list)分为两个子串行(sub-lists)。

 

算法步骤:

1从数列中挑出一个元素,称为基准”(pivot),

2重新排序数列,所有元素比基准值小的摆放在基准前面,所有元素比基准值大的摆在基准的后面(相同的数可以到任一边)。在这个分区退出之后,该基准就处于数列的中间位置。这个称为分区(partition)操作。

3 递归地(recursive)把小于基准值元素的子数列和大于基准值元素的子数列排序。

递归的最底部情形,是数列的大小是零或一,也就是永远都已经被排序好了。虽然一直递归下去,但是这个算法总会退出,因为在每次的迭代(iteration)中,它至少会把一个元素摆到它最后的位置去。

 

问题描述:

10个数进行快速排序。

10个数可以随机产生。

 

解题思路:

一趟快速排序的算法是:

①设置两个变量i、j,排序开始的时候i=0,j=9;

②以第一个数作为关键数赋值给key,即key=a[0];

③从j开始向前搜索,即由后开始先前搜索(j--),找到第一个小于key的值a[j],将a[j]赋值给a[i],并且i++;

④从i开始向后搜索,即由前开始向后搜索(i++),找到第一个大于key的值a[i],将a[i]赋值给a[j],并且j--;

⑤重估第3、4步,直到i=j。

 参考代码:

<span style="font-family:Courier New;font-size:14px;">#include<stdio.h>#include<stdlib.h>#define random(x) rand()%x;void Qsort(int a[],int lower,int highter){int i=lower,j=highter,key=a[lower];if(lower<highter){while(i<j){while(a[j]>=key&&i<j){j--;}a[i]=a[j];while(a[i]<=key&&i<j){i++;}a[j]=a[i];}a[i]=key;Qsort(a,lower,i-1);Qsort(a,j+1,highter);}}int main(){int a[10]={0};int i;for(i=0;i<10;i++)a[i]=random(99);printf("排序前数组的值:\n");for(i=0;i<10;i++)printf("%d\t",a[i]);Qsort(a,0,9);printf("排序后数组的值:\n");for(i=0;i<10;i++)printf("%d\t",a[i]);return 1;}</span><span style="font-family:楷体;font-size: 12pt;"></span>


0 0
原创粉丝点击