java 快速排序流程图_java简单快速排序实例解析

一、基本概念

找出一个元素(理论上可以随便找一个)作为基准(pivot),然后对数组进行分区操作,使基准左边元素的值都不大于基准值,基准右边的元素值 都不小于基准值,如此作为基准的元素调整到排序后的正确位置。递归快速排序,将其他n-1个元素也调整到排序后的正确位置。最后每个元素都是在排序后的正 确位置,排序完成。所以快速排序算法的核心算法是分区操作,即如何调整基准的位置以及调整返回基准的最终位置以便分治递归。

二、选择基准元

1、固定基准元

如果输入序列是随机的,处理时间是可以接受的。如果数组已经有序时,此时的分割就是一个非常不好的分割。因为每次划分只能使待排序序列减一,此时为最坏情况,快速排序沦为冒泡排序,时间复杂度为Θ(n^2)。而且,输入的数据是有序或部分有序的情况是相当常见的。因此,使用第一个元素作为基准元是非常糟糕的,应该立即放弃这种想法。

2、随机基准元

这是一种相对安全的策略。由于基准元的位置是随机的,那么产生的分割也不会总是会出现劣质的分割。在整个数组数字全相等时,仍然是最坏情况,时间复杂度是O(n^2)。实际上,随机化快速排序得到理论最坏情况的可能性仅为1/(2^n)。所以随机化快速排序可以对于绝大多数输入数据达到O(n×log(n))的期望时间复杂度。

3、三数取中

最佳的划分是将待排序的序列分成等长的子序列,最佳的状态我们可以使用序列的中间的值,也就是第N/2个数。可是,这很难算出来,并且会明显减慢快速排序的速度。这样的中值的估计可以通过随机选取三个元素并用它们的中值作为基准元而得到。事实上,随机性并没有多大的帮助,因此一般的做法是使用左端、右端和中心位置上的三个元素的中值作为基准元。

三、partition算法

partition算法是快速排序的核心,在学习快排之前,可以先学习一下这个算法。下面先贴代码:

public int partition(int[] num,int left,int right){

if(num==null || num.length<=0 || left<0 || right>=num.length){

return 0;

}

int prio=num[left+(right-left)/2]; //获取数组中间元素的下标

while (left<=right){ //从两端交替向中间扫描

while (num[left]

left++;

while (num[right]>prio)

right--;

if (left<=right){

swap(num,left,right); //最终将基准数归位

left++;

right--;

}

}

return left;

}

这个方法的思路是先找一个枢纽元(这个方法实现里面找的是第一个元素,具体其实大有文章不过这里先简化描述),再从数组的两边(具体从哪里到哪里由传进来额参数决定)生成两个指针left和right,每次发现左边的元素大于枢纽元则i停下来,右边的元素小于枢纽元j就停下来,并且交换这个两个数的位置。直到两个指针left,right相遇。再把枢纽元插入left的位置,也就是它应该在的位置。

这么做最后的结果是让数组的[left,right]部分呈现出2部分,枢纽元最终位置以左都是小于等于枢纽元的,以右都是大于等于枢纽元的。而枢纽元则被插入到了一个绝对正确的位置。

四、排序算法实现

package sort;

/**

* 快速排序

* 快速排序采用了分治策略。就是在一个数组中取一个基准数字,把小的数放基准的左边,大的数放基准的右边。

* 基准左边和右边分别是新的序列。在新的序列中再取一个基准数字,小的放左边,大的放右边。

* 这个里面用到的递归。我们需要三个参数,一个是数组,另外两个是序列的边界

* @author HJS

*/

public class QuickSort{

void sort(int num[],int left,int right){

if (left

int index=partition(num,left,right); //算出枢轴值

sort(num,left,index-1); //对低子表递归排序

sort(num,index+1,right); //对高子表递归排序

}

}

/**

* 调用partition(num,left,right)时,对num[]做划分,

* 并返回基准记录的位置

* @param num

* @param left

* @param right

* @return

*/

public int partition(int[] num,int left,int right){

if(num==null || num.length<=0 || left<0 || right>=num.length){

return 0;

}

int prio=num[left+(right-left)/2]; //获取数组中间元素的下标

while (left<=right){ //从两端交替向中间扫描

while (num[left]

left++;

while (num[right]>prio)

right--;

if (left<=right){

swap(num,left,right); //最终将基准数归位

left++;

right--;

}

}

return left;

}

public void swap(int[] num,int left,int right){

int temp = num[left];

num[left] = num[right];

num[right] = temp;

}

public static void main(String args[]){

int[] num={7,3,5,1,2,8,9,2,6};

new QuickSort().sort(num,0,num.length-1);

for(int n:num) {

System.out.print(n+" ");

}

}

}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Java快速排序算法的实例是:public static void quickSort(int[] arr, int low, int high) { int i = low, j = high; int temp; int pivot = arr[(low + high) / 2]; while (i <= j) { while (arr[i] < pivot) { i++; } while (arr[j] > pivot) { j--; } if (i <= j) { temp = arr[i]; arr[i] = arr[j]; arr[j] = temp; i++; j--; } } if (low < j) quickSort(arr, low, j); if (i < high) quickSort(arr, i, high); } ### 回答2: 快速排序是一种常用的排序算法,它利用分治的思想将一个大问题分成多个小问题进行解决。下面是一个使用Java实现的快速排序算法的示例: ```java public class QuickSort { public static void main(String[] args) { int[] arr = {9, 5, 7, 3, 1, 8, 6, 2, 4}; quickSort(arr, 0, arr.length - 1); System.out.println(Arrays.toString(arr)); } 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[high]; int i = low - 1; for (int j = low; j < high; j++) { if (arr[j] < pivot) { i++; swap(arr, i, j); } } swap(arr, i + 1, high); return i + 1; } public static void swap(int[] arr, int i, int j) { int temp = arr[i]; arr[i] = arr[j]; arr[j] = temp; } } ``` 以上代码实现了快速排序算法。首先,在main方法中定义一个待排序的数组。然后调用`quickSort`方法进行排序,该方法接受待排序数组、起始位置和结束位置作为参数。在`quickSort`方法内部,首先判断起始位置是否小于结束位置,如果是,则调用`partition`方法将数组划分为两部分,以一个基准值作为分界点,将比基准值小的元素放在基准值左边,比基准值大的元素放在基准值右边。然后递归地对基准值左边和右边的子数组进行排序。`partition`方法实现了划分的过程,采用双指针的方式,从左到右遍历数组,将小于基准值的元素与指针i指向的元素交换位置,同时将指针i向右移动。最后将基准值与指针i的元素交换位置,使得基准值处于正确的位置上。最终,数组将会按从小到大的顺序排序。 在主函数中输出排序后的数组,得到的结果为:[1, 2, 3, 4, 5, 6, 7, 8, 9]。这证明快速排序算法对给定的数组进行了正确的排序。 ### 回答3: 快速排序是一种常用的排序算法,其算法思想是通过选择一个基准元素,将待排序数组分成两个子数组,一个子数组中的元素都小于基准元素,另一个子数组中的元素都大于基准元素,然后对这两个子数组分别进行快速排序,最后将排好序的子数组合并即可得到整个数组的有序序列。 下面以Java代码为例,简单实现一下快速排序算法: ```java public class QuickSort { public static void quickSort(int[] array, int low, int high) { if (low < high) { // 分区操作,将数组分成两个子数组 int pivot = partition(array, low, high); // 对左子数组进行快速排序 quickSort(array, low, pivot - 1); // 对右子数组进行快速排序 quickSort(array, pivot + 1, high); } } private static int partition(int[] array, int low, int high) { // 选择基准元素 int pivot = array[low]; while (low < high) { // 从右向左找第一个小于基准元素的位置 while (low < high && array[high] >= pivot) { high--; } // 将小于基准元素的值移到左侧 array[low] = array[high]; // 从左向右找第一个大于基准元素的位置 while (low < high && array[low] <= pivot) { low++; } // 将大于基准元素的值移到右侧 array[high] = array[low]; } // 将基准元素放入最终位置 array[low] = pivot; // 返回基准元素的索引位置 return low; } public static void main(String[] args) { int[] array = {6, 5, 3, 1, 8, 7, 2, 4}; int low = 0; int high = array.length - 1; quickSort(array, low, high); System.out.println("排序结果:"); for (int i : array) { System.out.print(i + " "); } } } ``` 以上是一个简单快速排序算法的实例。在主函数中,创建一个待排序的数组,并调用`quickSort`函数进行排序,并输出排序结果。通过运行程序,可以看到输出的排序结果为`1 2 3 4 5 6 7 8`,表明快速排序算法能够正确地对数组进行快速排序

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值