[Java]快速排序算法完整代码

快排作为排序算法里的明星算法,大家当然是要掌握的啦!
作为小白的时候觉得它很高大上很难,其实一点也不难的,大家动手敲几遍就能掌握。
另外虽然这里是用Java实现的,但其实一点也没用到java的特性,用C、C++来写也都是一样的
  • 核心只有quickSort 这一个函数
package leetcode;

import java.util.Arrays;
import java.util.Scanner;

/**
 * 演示快速排序算法,平均时间复杂度O(nlogn) 最差情况O(n2)
 */
public class QuickSort {
    public static void main(String[] args) {
        //先接收输入
        System.out.print("请输入数列长度n: ");
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt(); //长度n
        int[] a = new int[n]; //用a数组中保存n个数
        System.out.println("请输入n个数,空格分隔:");
        for (int i = 0; i < n; i++) {
            a[i] = sc.nextInt();
        }
        //调用快排函数
        quickSort(a,0,n-1);
        System.out.println("快速排序结果是:");
        System.out.println(Arrays.toString(a)); //输出排序后的数组

    }
    //对a[left,right]区间内的数进行快排
    public static void quickSort(int[] a, int left , int right) {
        if(left >= right) { //区间内只有一个元素或没有元素时就不必排了,这也是递归出口
            return ;
        }
        int i = left , j = right; // i、j就为我们要移动的两个指针,初始化i为左边界,j为右边界
        int index = left;   //index是基准元的下标,我们取首元素作为基准元
        while (i < j) {
            while(a[j] > a[index] && i != j) { //右指针j要找到第一个小于基准元的元素下标,所以只要大于就向左移
                j--;
            }
            while (a[i] <= a[index] && i != j) { //左指针i要找到第一个大于基准元的元素下标,所以只要小于等于就右移
                i++;
            }
            if(i != j) { //如果i、j还没相遇,说明它们找到了一对“逆序对”,于是交换,交换以后不移动指针,进行下一轮的循环
                int temp = a[i];
                a[i] = a[j];
                a[j] = temp;
            }
            //如果i、j相遇说明这轮遍历已经结束了,不再符合i < j的条件,跳出循环
        }
        if(i == j) { //一次遍历完成,交换基准元,递归
            int temp = a[index];
            a[index] = a[i];
            a[i] = temp;
            //现在a[i]已经归位了,下面递归排序[left,i-1]、[i+1,right]这两个子区间
            quickSort(a,left,i-1); //当前i = j,用i或者j都行
            quickSort(a,i+1, right);
        }
    }
}

 运行截图: 

  • 0
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值