算法-排序-快速排序

package com.test.sort;

public class KuaiSuSort {
	public void printSort(int[] arr) {
		StringBuilder sbu = new StringBuilder();
		sbu.append("[");
		for (int i = 0; i < arr.length; i++) {
			if(i == arr.length -1) {
				sbu.append(arr[i] + "]");
			}else {
				sbu.append(arr[i] + ",");
			}
		}
		System.out.println(sbu.toString());
	}
	/**
	 * 标记一个数字,然后将所有数分为两部分,一部分比他大的放他右边,一部分比他小的放左边
	 * 再利用递归不断按上面排序
	 * @param arr
	 * @param low
	 * @param high
	 */
	public void kuaiSuSort(int[] arr,int low,int high) {
		//最小循环数
		int start = low;
		//最大循环数
		int end = high;
		//标记数
		int key = arr[low];
		//整体大循环 将所有数 分为两部分 比标记数 大的放在标记数右边 ,比标记数小的放在标记数左边 
		while(start < end) {
			//从后开始,从后往前,将小的放在标记数key前面,如果比key大就跳过 end--
			while(start < end && arr[end] >= key) {
				end --;
			}
			//将小于key的放前面
			if(arr[end] <= key) {
				int temp = arr[end];
				arr[end] = arr[start];
				arr[start] = temp;
				new KuaiSuSort().printSort(arr);
			}
			//从前开始,从前往后,将大的放在标记数key后面,如果比key小就跳过 end--
			while(start < end && arr[start] <= key) {
				start++;
			}
			//将大于key的放后面
			if(arr[start] >= key) {
				int temp = arr[start];
				arr[start] = arr[end];
				arr[end] = temp;
				new KuaiSuSort().printSort(arr);
			}
			//递归调用
			if(low < start) {
				kuaiSuSort(arr , low,start-1);
				new KuaiSuSort().printSort(arr);
			}
			if(end < high) {
				kuaiSuSort(arr , end+1,high);
				new KuaiSuSort().printSort(arr);
			}
		}
	}
	public static void main(String[] args) {
		int []arr={12,20,5,16,15,1,2,100,30,45,23,9};
        int low=0;
        int high=arr.length-1;
        System.out.println("排序前");
        new KuaiSuSort().printSort(arr);
        System.out.println("排序后");
        new KuaiSuSort().kuaiSuSort(arr, low, high);
        new KuaiSuSort().printSort(arr);
	}
}


打印结果:

posted @ 2021-03-04 16:35  多米诺的古牌  阅读(33)  评论(0)    收藏  举报