快速排序算法

来源:互联网 发布:彩通网络小额贷款牌照 编辑:程序博客网 时间:2024/06/17 11:58

一言不合我就贴代码:

package arithmetic;/**快速排序 * @author Administrator * */public class QuickSortDemo {public static void quickSort(int []arr,int  left,int right ){if (left>right) {return;}int i,j,base;i=left;j=right;base=arr[i];//当i==j的时候表示此轮排序结束while (i!=j) {//顺序很重要!看你选择哪一个当基数咯..// 先从右往左找比base小的 while (arr[j] >= base && i < j) {j--;}//再从左往右找比base大的数while(arr[i] <= base && i < j){i++;}//当找得i比j小的时候就交换他们的位置.[也就是说,当二者没有重叠重复的时候交换]if (i < j) {int t=arr[j];arr[j]=arr[i];arr[i]=t;}}//交换基数.arr[left]=arr[i];arr[i]=base;quickSort(arr, left, i-1);//继续下一轮循环,处理左边的排序.quickSort(arr, i+1,right);//继续下一轮训话,处理右边的排序.}public static void main(String[] args) {int []a={9,5,8,1,0,2,3,4,6,10,7};quickSort(a,0, a.length-1);for (int i : a) {System.out.print(i+",");}}}

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

实现步骤:

1.以一个数为基准.我习惯以第一个为基准

2.重新排列数列.比基数大的放右边,比基数小的放左边 .具体实现为  先从右往左找第一个比基数小的数字.然后从左往右找第一个比基数大的数字,以此循环.直到将所有数字全部访问一遍后,此操作完成之后,比基数小的在左边,比基数大的在右边.此操作称为分区操作.

3.递归循环,继续进行排序

ps:

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



再偷别的帖子的一张图片,以便更加形象的表述,防止过段时间自己也忘记了:



0 0
原创粉丝点击