快速排序之一路快速排序(Java实现)

在这里插入图片描述

一路排序不考虑等于的情况,将等于的数字划分到大于区或者等于区,还有一个特点就是一路排序从左到右遍历。废话不多说,直接上代码,好东西都在代码里。边看图边写代码边写注释,真的是美滋滋了呢!

package sort;

public class QuickSort {
	/*
	 * 4 3 2 4 5 8 7 3 6
	 * 4 3 2 4
	 */
	public static void sort(int[] arr) {
		quicksort(arr, 0, arr.length - 1);
	}

	private static void quicksort(int[] arr, int start, int end) {
		// TODO Auto-generated method stub
		if(end-start<=15) {
			/*
			 * 当最后剩下需要排的数据少的时候,
			 * 这些剩下的数据已经极度有序了,用插入排序。
			 */
			InsertSort.sort(arr, start, end);
			return;
		}
		int target=findpartition(arr,start,end);
		quicksort(arr, start, target);//对小于等于部分排序
		quicksort(arr, target+1, end);//对大于部分排序
	}

	private static int findpartition(int[] arr, int start, int end) {
		// TODO Auto-generated method stub
		/*
		 * 由于刚开始的start位置的值V有可能左边的值都比他大,
		 * 造成递归形成的树左偏或者右偏,为不平衡二叉树。
		 * 所以要将V值随机。
		 */
		swap(arr,start,(int) (Math.random()*(start-end+1)+start));
		int v=arr[start];
		int j=start;
		for(int i=start+1;i<=end;i++) {
			if(arr[i]<=v) {
				/*
				 * 4 3 2 4 5 8 7 3 6
				 * s     j       i  
				 * 4 3 2 4 把5和3交换 i在3的位置 j在4的位置 j++
				 * 4 3 2 4 3 8 7 5 6
				 * s       j       i  s~j小于等于V j+1~到i 大于V
				 */
				swap(arr,j+1,i);
				j++;
			}
			
		}
		//将分区设置好后,将j和start位置的值交换,
		//4 3 2 4 3 8 7 5 6
		//s       j       i
		//此时,4的左边就是小于等于4的值,右边大于。
		//3 3 2 4 4 8 7 5 6
		//s       j       i
		//然后返回j  再对j的两边排序
		swap(arr,j,start);
		return j;
	}

	private static void swap(int[] arr, int i, int j) {
		// TODO Auto-generated method stub
		/*
		 * 数字用这个 temp那个通用
		 * a:3 b:4
		 * a=3+4=7;
		 * b=7-4=a-b=3
		 * a=a-b=q-3=4
		 * 不推荐
		 */
		/*
		 * 数据量大用异或
		 * a = a ^ b;将a变成中间变量
           b = b ^ a;
           a = a ^ b;
		 */
		/*
		arr[i]=arr[i]+arr[j];
		arr[j]=arr[i]-arr[j];
		arr[i]=arr[i]-arr[j];
		*/
		arr[i]=arr[i]^arr[j];
		arr[j]=arr[i]^arr[j];
		arr[i]=arr[i]^arr[j];
	}
}

测试代码

package sort;

import java.util.Arrays;
import java.util.Random;

public class TestAllSort {
	public static void main(String[] args) {
		int arr[]= {2,3,6,3,5,9,0,1,18,10,11,7};
		/*
		int arr[]=new int[50000];
		Random ro=new Random();
		for(int i=0;i<arr.length;i++) {
			arr[i]=ro.nextInt(10000);
		}*/
		int starttime=(int) System.currentTimeMillis();
		//CountIntegerSort.sort(arr);
		//Arrays.sort(arr);
		//MergeSort.sort(arr);
		QuickSort.sort(arr);
		int endtime=(int) System.currentTimeMillis();
		System.out.println(Arrays.toString(arr));
		System.out.println(endtime-starttime+"ms");
	}
}

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
快速排序是一种常用的排序算法,它的基本思想是通过一趟排序将待排序的数据分割成独立的两部分,其中一部分的所有数据都比另一部分的所有数据小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。 以下是Java实现快速排序的代码示例: ```java public class QuickSort { public static void quickSort(int[] arr, int low, int high) { if (low < high) { int pivot = partition(arr, low, high); // 划分数组 quickSort(arr, low, pivot - 1); // 对左子数组进行快速排序 quickSort(arr, pivot + 1, high); // 对右子数组进行快速排序 } } public static int partition(int[] arr, int low, int high) { int pivot = arr[low]; // 选取第一个元素作为基准值 while (low < high) { while (low < high && arr[high] >= pivot) { high--; } arr[low] = arr[high]; // 将比基准值小的元素移到低端 while (low < high && arr[low] <= pivot) { low++; } arr[high] = arr[low]; // 将比基准值大的元素移到高端 } arr[low] = pivot; // 基准值归位 return low; // 返回基准值的位置 } public static void main(String[] args) { int[] arr = {5, 2, 8, 9, 1, 3}; quickSort(arr, 0, arr.length - 1); System.out.println(Arrays.toString(arr)); } } ``` 以上代码实现快速排序算法。在`quickSort`方法中,首先选择一个基准值(这里选择第一个元素),然后通过`partition`方法将数组划分为两部分,左边的元素都比基准值小,右边的元素都比基准值大。然后递归地对左右子数组进行快速排序,直到排序完成。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值