您的位置:首页 > 编程语言 > Java开发

快速排序-java实现

2015-05-07 16:29 302 查看
快速排序(Quicksort)是对冒泡排序的一种改进。

基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列

//快速排序算法
public class QuitSort {
	public static void main(String[] srgs){
		int arr[] = {12,2,16,30,28,10,16,20,6,18};
		show(arr);
		quit_sort(arr, 0, arr.length - 1);
		show(arr);
	}
	
	//输出数组
	private static void show(int[] arr){
		int len = arr.length;
		int i;
		for(i = 0; i < len - 1; i++){
			System.out.print(arr[i] + " ");
		}
		System.out.println(arr[len - 1]);
	}
	
	//排序算法
	private static void quit_sort(int[] arr, int begin, int end){
		int pivot = arr[begin];	//选取的参考对象
		int low = begin;		//起始指针
		int height = end;		//末尾指针
		boolean direction = true; //比较方向的位置
		
		if(height - low <= 1){
			return; 					//不用排序
		}
		
	L1:	while(low < height){
			if(direction){ 				//从右到左
				for(int i = height; i > low; i--){
					if(arr[i] < pivot){
						arr[low++] = arr[i];
						height = i;
						direction  = !direction;
						continue L1;
					}
				}
				height = low;				
			}else{						//从左到右
				for(int i = low; i < height; i++){
					if(arr[i] > pivot){
						arr[height--] = arr[i];
						low = i;
						direction  = !direction;
						continue L1;
					}
				}
				low = height;				
			}						
		}
		arr[low] = pivot;			//最后将比较对象赋值
		quit_sort(arr, begin, low - 1);		//左半部分排序
		quit_sort(arr, low + 1, end);		//有半部分排序
	}
}


使用while循环的举例

public static void quit_sort(int a[], int low, int high)
	{
	    if(low >= high)
	    {
	        return;
	    }
	    int first = low;
	    int last = high;
	    int key = a[first];/*用字表的第一个记录作为枢轴*/
	 
	    while(first < last)
	    {
	    	//找右半部分小于key的值
	        while(first < last && a[last] >= key)
	        {
	            --last;
	        }
	        a[first] = a[last];/*将比第一个小的移到低端*/
	        
	        //找左半部分大于key的值
	        while(first < last && a[first] <= key)
	        {
	            ++first;
	        }
	        a[last] = a[first];	/*将比第一个大的移到高端*/
	    }
	    /*将枢轴存到起始位置【因为key的值是起始元素】
		否则,起始位置数据会丢失 
			注 起始位置不是数组的第一个元素,是while循环后的位置
	*/
	    a[first] = key;
	    quit_sort(a, low, first-1);
	    quit_sort(a, first+1, high);
	}


平均复杂度是:nlog(n)

最坏的情况是: n^2

最好的情况是: nlog(n)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: