算法——基础篇——高速排序
高速排序是一个常常使用的算法,因为每次用的时候,都感觉没有理解清楚,特写一篇文章记录一下。
算法介绍
高速排序有点类似有冒泡排序,冒泡排序从相邻的两个元素比較。小的在左边,大的在右边。这个算法非常easy理解。而高速排序它相当于是在一头一尾两边分别排序比較,比較的对象是当前元素值,和一个选定的key值,主题的思想就是通过跟key值比較。把大于key的值放在右边。小于的放在左边这样就完毕了一次排序,接着在对key值左边的序列进行相同的操作,右边也是,最后便能将全部的元素给排好序,因为它每次排序。都会分成左右两部分,左边和右边的相对于key值来说是排好序的,接着仅仅须要对左右两边分别递归一次排序的过程就能够了,它的效率较冒泡排序还是要高非常多的,O(nlgn)...
具体处理过程:(来自百度百科)
设要排序的数组是A[0]……A[N-1],首先随意选取一个数据(通常选用数组的第一个数)作为重要数据。然后将全部比它小的数都放到它前面。全部比它大的数都放到它后面,这个过程称为一趟高速排序。值得注意的是。高速排序不是一种稳定的排序算法,也就是说,多个同样的值的相对位置或许会在算法结束时产生变动。
一趟高速排序的算法是:
1)设置两个变量i、j。排序開始的时候:i=0,j=N-1;
2)以第一个数组元素作为重要数据。赋值给key,即key=A[0];
3)从j開始向前搜索,即由后開始向前搜索(j--)。找到第一个小于key的值A[j],将A[j]赋给A[i]。
4)从i開始向后搜索。即由前開始向后搜索(i++)。找到第一个大于key的A[i],将A[i]赋给A[j]。
5)反复第3、4步,直到i=j; (3,4步中。没找到符合条件的值,即3中A[j]不小于key,4中A[i]不大于key的时候改变j、i的值,使得j=j-1,i=i+1,直至找到为止。
找到符合条件的值,进行交换的时候i。 j指针位置不变。另外。i==j这一过程一定正好是i+或j-完毕的时候。此时令循环结束)。
代码:
package hello.ant; public class AlogQuickSort { public static void main(String[] args) { int array[]={4,5,1,2,0,11,3,6}; // int array[]={4,5,1,2,0,6}; sort(array,0,array.length-1); for(int i=0;i<array.length;i++){ System.out.print(array[i]+" "); } } static void sort(int[] array, int low, int heigh) { int i=low,j=heigh; if(i>j){ return; } int key=array[i]; while(i<j){ while(i<j&&array[j]>=key){ j--; } array[i]=array[j]; while(i<j&&array[i]<=key){ i++; } array[j]=array[i]; } array[i]=key; sort(array, low, i-1); sort(array, j+1, heigh); } }
0 1 2 3 4 5 6 11