快速排序

算法思想

     选择一个基准元素,通常选择第一个元素或者最后一个元素,通过一次扫描,将待排序列分成两部分,一部分比基准元素小,一部分大于等于基准元素,此时基准元素在器拍好序后的正确位置,然后在用同样的方法递归地划分的两部分。

实例演示

快速排序

代码实现

package test.algorithm.FastSlowPointer;

public class QuickSort {
	
	/**
	 * 元素交换
	 * @param k
	 * @param low
	 * @param high
	 */
	public static void swap(int k[], int low, int high)
	{
		int temp;

		temp = k[low];
		k[low] = k[high];
		k[high] = temp;
	}
	
	/**
	 * 划分
	 * @param list
	 * @param low
	 * @param high
	 * @return
	 */
	public static int partition(int[] list,int low,int high){
		 
		//数组的第一个作为中值
		int point = list[low];
		
		while(low < high){
			
			//从高位遍历,获取比中值小的下标(high)
			while(low<high && list[high]>=point){
				high--;
			}
			
			//比中值小的记录移到低端
			list[low] = list[high];   
			
			//从低位遍历,获取比中值大的下标 (low)
			while(low<high && list[low]<=point){
				low++;
			}
			
			//比中值大的记录移到高端
			list[high] = list[low];   
		}
		
		// low和hight相等,这就是point在整个排序中的位置
		// 低端的都比 point小,高端的都比point大
		list[low] = point;              
		  
        return low; 
	}
	
	/**
	 * 快速排序
	 * @param list
	 * @param low
	 * @param high
	 */
	public static void QSort(int[] list, int low, int high){
		
		int point = 0;
		if(low < high){
			//将list数组进行一分为二
			point = partition(list,low,high);
			
			//对低位序列进行递归排序
			QSort(list,low,point-1);
			//对高位序列进行递归排序
			QSort(list,point+1,high);
		}
		
	}
	
	/**
	 * 快速排序
	 * @param list
	 */
	public static void quickSort(int[] list){
		QSort(list,0,list.length-1);
	}

	public static void main(String[] args) {
		int[] list = {4, 2, 5, 0, 3, 9, 1, 7, 6, 8};

		quickSort(list);
		
		System.out.print("打印数组:");
		for(int i :list){
			System.out.print(i+" ");
		}
	}

}



你可能感兴趣的:(快速排序)