算法——基础篇——高速排序

高速排序是一个常常使用的算法,因为每次用的时候,都感觉没有理解清楚,特写一篇文章记录一下。

算法介绍


高速排序有点类似有冒泡排序,冒泡排序从相邻的两个元素比較。小的在左边,大的在右边。这个算法非常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 


原文地址:https://www.cnblogs.com/brucemengbm/p/6922504.html