快排

快排

  • 何为快排:通过迭代跟中枢轴上的元素进行比较,有两种情况,用两个临时变量对数组一个从前遍历,一个从后遍历,当那个从前开始遍历的临时变量值1大于中枢轴的值时、且当那个从后开始遍历的临时变量值2小于中枢轴值时,两个临时变量存的数据进行互相交换。

  • 思路:

  1. 声明中枢值key为下标0的元素

  2. 将left和right分别赋给l变量和r变量,为下面操作提供类似指针操作遍历

  3. 满足当l小于r时,l和r开始工作查找,先r(右边)遍历再l(左边)遍历查找

  4. 直到都工作完,交换数据

  5. 迭代

    • 首先把l中的数据给了key做为新的中枢值

    • 其次把原来的key的数据给了l,实现了数据交换

    • 然后递归左部分进行排序:从left到l-1

      递归右部分进行排序:从l+1到right

  • 代码实现:
package com.guodaxia.quicksorts;
/**
* @ author Guo daXia
* @ create 2022/11/14
*/
public class QuickSorts {
public static void main(String[] args) {
System.out.print("原数组:[");
for (int i = 0; i < arr.length; i++) {
System.out.print(arr[i]);
System.out.print(" ");
}
System.out.println("]");
System.out.print("使用快排排序好的数组:[");
quick(arr,0,arr.length-1);
for (int i :arr) {
System.out.print(i);
System.out.print(" ");
}
System.out.println("]");
}
//初始化数组
static int[] arr = new int[]{1,7,4,6,8,9,2,3};
//定义一个方法,用于实现快排
public static void quick(int[] arr, int left, int right){
//先解决掉一些限制,主要是现实限制
if (arr==null||arr.length==0){
return;
}
if (left>right){
return;
}
//声明枢轴:即中位数
int key = arr[left];//约定第一个元素
int l = left; //临时变量l用于遍历,下面r作用相同
int r = right;
while (l!=r){//当l变量在r的左边,进行循环查找
while (arr[r]>=key&&l<r){//r变量从右找,直到找到值小于key值为止
r--;
}
while (arr[l]<=key&&l<r){//l变量从左找,直到找到值大于key值为止
l++;
}
//两个临时变量已经停下来了:arr[r]值小于key;arr[l]值大于key
//可以交换两临时变量对应的数据\
if (l<r){
int temp = arr[l];
arr[l]= arr[r];
arr[r]=temp;
}
}
//通过以上第一遍循环,实现了一次交换,数组分为两个小部分:
//左边的值都小于key值,而右边的值都大于key值
//使用两个递归,各种实现通过新key值交换
arr[left]=arr[l];//将l中的数据给left,
arr[l]=key;//将key的数据给l
quick(arr,left,l-1);//左小部分
quick(arr,l+1,right);//右小部分
}
}
posted @   gdxstart  阅读(593)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)
点击右上角即可分享
微信分享提示