首页 > 编程知识 正文

快速排序算法在每一趟排序中都能找到,快速排序详解

时间:2023-05-03 05:28:26 阅读:31624 作者:1917

快速排序介绍

快速排序(Quicksort )是对气泡排序的改进,与气泡排序一样,快速排序也是交换排序,通过元素之间的比较和交换位置来达到排序的目的。 不同之处在于,气泡排序在每一匝中仅将一个元素鼓泡通过数列的边缘,快速排序在每一匝中选择一个基准元素,将大于基准元素的其他元素移动到数列的边缘,以及选择小于基准元素的元素

基本思路是:将待排序的数据按一次排序划分为两个独立的部分,其中一个部分的所有数据小于其他部分的所有数据,然后用这种方法分别快速对两个部分的数据进行排序,递归地进行整个排序过程

快速排序详解过程

原始数组如下所示,必须按从小到大的顺序对数组进行排序

1、选择基准元素。 在此情况下,选择数组中的第一个元素作为基准元素,定义“左(左)”、“右(右)”right指针,并逐步向右、向左移动以获取要排序的元素,然后与基准元素进行比较以确定要排序的元素的位置。 初始位置是指数组的起始位置和末尾位置

2.1、如果第一个数组排序的第一个循环开始,从右(right )指针开始,右(right )指针指向的待排序元素大于或等于基准元素,则继续左移。 同时,确保左光线,不获取已比较或更换的元素。 右)直到right指针指向的待排序元素小于基准元素

在当前数组中,值为14,因此停止将“右”(right )指针向左移动,切换到“左”(reference )指针,然后继续下一步操作

2.2、左(左)指针指向的排序对象要素小于基准要素时,继续向右移动。 同时,保证左光线,防止获取已比较或更换的元素。 左)指针指向的排序对象要素大于基准要素,停止向右移动

左(left )指针最初指向基准要素,判定为一定相等,所以左(left )指针向右移动1位

7 4因此,左(left )指针停止在元件7的位置,进行元件更换操作

2.3、交换右(right )指针指向的元素和左(right )指针指向的元素

(注意)紫色 表示 基准元素,绿色 表示比基准元素 小,橙色 表示比基准元素 大

2.4、第一次数组排序的第二个循环开始,重复2.1到2.3的步骤即可得到结果

3、进入第一个数组排序的第四个循环后,“右”指针向左移动到元素3,停止移动。 此时,右)指针和左)指针已经重叠,需要进行基准要素和右)左)指针重叠位置的要素的更换操作

交换完成后,数组左侧的所有元素都小于4,数组右侧的所有元素都大于4,第一个数组的排序结束

4、进入第二次排列排序。 第2次排列排序前的状态是小于基准要素4的子排列、大于基准要素4的子排列。 对这两个子数组分别进行左递归快速排序、右递归快速排序,最终得到从小到大排序的有序数组

总结

在每次快速排序比较的开始,选择元素作为基本元素,例如选择数组中的第一个元素作为基本元素。 然后,使用“左”(left )右指针比较数组中的要排序的元素和基本元素,以交换右小于基本元素的要排序元素和左大于基本元素的要排序元素。 然后,使用拆分管理方法拆分数组,将数组拆分为两个子序列(相对于基准元素),并递归执行上述步骤,直到子序列中的其馀一个元素无法拆分。 此时,整个序列将是有序序列

代码实现

package com.zzb.sort; import java.util.Arrays;/* * @ auther :管理员* @ date :2020/3/912:25 * @ description :快速排序* /公共类快速排序{ public class quick sort } 系统. out.println (arrays.tostring (array ) ); } /** *快速排序算法(闲话:整个算法类似于二叉树节点的前遍历操作) * @param array排序对象数组) * @param startIndex数组的开头索引(* @param endIndex数组)

{ // 元素交换时的中间变量 int temp; // 数组的头部索引 大于或者等于 数组的尾部索引,不需要比较 // 该情况为子数组中只用一个待排序元素(只有一个元素就是有序) if(startIndex >= endIndex) { return; } // 基准元素,选取数组中的第一元素作为基准元素 int pivot = array[startIndex]; // 定义左、右指针通过逐步向右、左移动来获取待排序元素并与基准元素进行比较,确定待排序元素的位置 // 左指针 int left = startIndex; // 右指针 int right = endIndex; // 循环获取数组中的所有待排序元素与基准元素进行比较,确定待排序元素的位置 while(left < right) { // 右指针指向的待排序元素 大于或者等于 基准元素,则继续向左移动 // 同时要保证 left < right,防止获取到已经比较过或者已经交换过的元素 // 直到右指针指向的待排序元素 比 基准元素 小,停止向左移动 while(array[right] >= pivot && left < right) { right --; } // 左指针指向的待排序元素 小于或者等于 基准元素,则继续向右移动 // 同时要保证 left < right,防止获取到已经比较过或者已经交换过的元素 // 直到左指针指向的待排序元素 比 基准元素 大,停止向右移动 while(array[left] <= pivot && left < right) { left ++; } // 在while循环中的左右指针多次移动,可能会导致 left >= right,故需要判断后再交换待排序元素的位置 if(left < right) { temp = array[left]; array[left] = array[right]; array[right] = temp; } } //一趟交换完将基准元素放入临界位置 // 基准元素 左边 的元素都比基准元素 小 // 基准元素 右边 的元素都比基准元素 大 array[startIndex] = array[left]; array[left] = pivot; // 基准元素的左边子数组进行递归快速排序(题外话:整个算法类似于二叉树的节点的前序遍历操作) quickSort(array, startIndex, left - 1); // 基准元素的右边子数组进行递归快速排序(题外话:整个算法类似于二叉树的节点的前序遍历操作) quickSort(array, left + 1, endIndex); }}

 

 

 

 

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。