面试-手撕快排-java实现

56 篇文章 4 订阅

快要秋招了,可能会手撕快排,提前准备,记录一下。
/**
* 快排,是冒泡的一个改进;注意:快排【不稳定】,它有可能打破原来值为相同的元素之间的顺序。
* 采用分治法,通过一趟排序将数据分为两部分,比基准值小的元素放在基准值的前面,比基准值大的元素放在基准后面;
* 递归子序列
* 最好情况和平均时间复杂度都是O(nlogn) ;最坏时间复杂度为O(n^2),空间复杂度为O(1)
*/

方式1: partition版本

package scu.stone.spring;

import java.util.Arrays;

public class QuickSort {
	/**
	 * 快排,是冒泡的一个改进;注意:快排【不稳定】,它有可能打破原来值为相同的元素之间的顺序。
	 * 采用分治法,通过一趟排序将数据分为两部分,比基准值小的元素放在基准值的前面,比基准值大的元素放在基准后面;
	 * 递归子序列
	 * 最好情况和平均时间复杂度都是O(nlogn) ;最坏时间复杂度为O(n^2),空间复杂度为O(1)
	 */
	public static void main(String[] args) {
		int [] array = {1,2,9,7,6,5,8,4,3};
		int [] array2 = {1,2,9,7,6,5,8,4,3};
		quickSort(array, 0, array.length-1);
		System.out.println(Arrays.toString(array));
		System.out.println("======================");
		quickSort_partition(array2, 0, array.length-1);
		System.out.println(Arrays.toString(array2));
	}
	public static void quickSort_partition(int [] array,int start, int end) {
		if (start >= end) {
			return;
		}
		int index = patition(array, start, end);
		quickSort_partition(array, start, index-1);
		quickSort_partition(array, index+1, end);
	}
	
	public static int patition(int[] array,int start,int end) {
		int flag = array[start]; //哨兵
		while (start < end)
		{
			while(start < end && array[end] >= flag )  //从后往前 
				end--;
			swap(array,start, end);  //遇到比哨兵小的,就交换
			while (start < end && array[start] <= flag)   //从前往后
				start++;
			swap(array, start, end); //遇到比哨兵大的,就交换
		}
		return start;
	}
	
	public static void swap(int[] array,int i,int j) {
		int temp = array[i];
		array[i] = array[j];
		array[j] = temp;
	}
}

方式二: 填坑版本

	public static void quickSort(int[] array,int low,int high) {
		if (array == null || array.length <= 0) {
			return;
		}
		if (low >= high) {
			return;
		}
		int left = low;
		int right = high;
		int key = array[left];  //挖坑1:保存基准值
		while (left < right) {
			while (left < right && array[right] >= key) {
				right--;
			}
			array[left] = array[right]; //挖坑2:从后向前找到比基准值小的元素,插入到基准位置坑1中
			while(left < right && array[left] <= key) {
				left++;
			}
			array[right] = array[left]; //挖坑3:从前往后找到比基准大的元素,放到刚才挖的坑2中
		}//end while
		array[left] = key;  //基准值填补到坑3中,准备分治递归快排
		
		System.out.println("Sorting: " + Arrays.toString(array));
		quickSort(array, low, left-1);  //递归
		quickSort(array, left+1, high);
	}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值