快速排序 (java)

三人行,必有我师,仅仅提供一个思考的方向

  • 以下排序结果都为 从小到大
  • 快速排序为不稳定排序
  • 思想 : 分治法

方法 1

关键过程图 divide()函数

在这里插入图片描述

java 代码

/**
 * @author jishali
 *
 */
public class QuickSort {

	public static int divide(int[] array, int l, int r) {
	
		int temp = array[l];     // 轴点元素
		
		while (l < r) {

			while (l < r) {
				if (temp < array[r]) {      // 如果是  <= ,当相同元素较多时,会出现轴点元素temp分布不均匀,
					r--;
				} else {
					array[l] = array[r];
					l++;
					break;
				}
			}
			while (l < r) {
				if (temp > array[l]) {
					l++;
				} else {
					array[r] = array[l];
					r--;
					break;
				}
			}
		}
		array[l] = temp;  // 将轴点元素放在最后的坑位
				
		return l;    
	}

	public static void quickSort(int[] array, int l, int r) {
		if (l>r) {
			return;
		}
		
		int middle = divide(array, l, r);
		quickSort(array, l, middle - 1);
		quickSort(array, middle + 1, r);
	}

	public static void result(int[] array) {
		for (int i : array) {
			System.out.print(i + " ");
		}
	}
	
	public static void main(String[] args) {

		int[] array = {3,5,6,2,9,0};
		quickSort(array, 0, array.length-1);
		result(array);
	}
}

方法 2

关键过程图 divide()函数

在这里插入图片描述

java 代码

package compare;

public class QuickSort {
	
	public static int divide(int[] array, int L, int R) {
		int point = array[R];
		int j = L;
		for (int i = L; i < R; i++) { 
			if (array[i] < point) {
				int temp = array[j];
				array[j] = array[i];
				array[i] = temp;
				j++;
			}
		}

		int temp = array[j];
		array[j] = array[R];
		array[R] = temp;
		
		// 查看每一次破风的结果
//		for (int re : array) {
//			System.out.print(re + " ");
//		}
//		System.out.println(" : run");
		
		return j;

	}

	public static void quickSort(int[] array, int l, int r) {
		if (l > r) {
			return;
		}

		int middle = divide(array, l, r);
		quickSort(array, l, middle - 1);
		quickSort(array, middle + 1, r);

	}

	public static void result(int[] array) {
		for (int i : array) {
			System.out.print(i + " ");
		}
	}

	public static void main(String[] args) {

		int[] array = { 10, 4, 7, 2, 9, 0, 7 };
		quickSort(array, 0, array.length - 1);
		result(array);

	}

}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值