常用排序算法解析-冒泡排序 插入排序 快速排序

本文详细介绍了三种常见的排序算法:冒泡排序、插入排序和快速排序。包括每种算法的基本思想、实现步骤、时间复杂度及相应的Java代码实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一 冒泡排序

冒泡排序是最简单的排序算法之一,也是面试中常考的算法。其实现的基本思路是:
(1)使用一前一后两个指针,i, j
(2)j一直往前走,i从每次从0开始扫描到j
(3)i位置的元素与j位置的元素交换,确保0-j位置的数字都按序排列

时间复杂度:O(n2)

代码如下:

  @Test
    public void testBubbleSort(){
        int[] nums = {5,1,4,7,2};
        bubbleSort(nums);
        System.out.println(new Gson().toJson(nums));
    }
    private void bubbleSort(int[] nums){
        for(int j = 1; j <nums.length; j++){
            for(int i =0;i<j; i++){
                if( nums[i] > nums[j]){
                    swap(nums, i, j);
                }
            }
        }
    }

    public void swap(int[] nums, int i, int j){
        int tmp = nums[i];
        nums[i] = nums[j];
        nums[j] = tmp;
    }

二 插入排序

插入排序的基本思路:
(1)从第一个元素开始,该元素可以认为已经被排序
(2)取出下一个元素A,在已经排序的元素序列中从后向前扫描
(3)如果该元素(已排序)大于A,将该元素移到下一位置,A填充到该位置
(4)重复步骤3,直到找到已排序的元素小于或者等于新元素的位置
确保0-i的位置一直处于排序好的状态

时间复杂度:在数组已经排序好的情况下,时间复杂度是O(n),最坏情况下,数组完全逆序,时间复杂度是O(n^2)

代码如下:

@Test
    public void test(){
        int[] nums = {6,5,3,1,8,7,2,4};
        insertSort(nums);
        System.out.println(new Gson().toJson(nums));
    }

    public void insertSort(int[] nums) {
        int i, j, key;
        for (i = 1; i < nums.length; ++i) {
            key = nums[i];
            for (j = i - 1; j >= 0; --j) {
                if (nums[j] > key){
                    nums[j + 1] = nums[j];
                }else{
                    break;
                }
            }
            nums[j] = key;
        }
    }

三 快速排序

快速排序的基本思路:
(1)在数据集中选择一个元素作为基准pivot
(2)所有小于基准的元素都挪到基准的左边,所有大于基准的元素都挪到基准的右边,这个操作称为分区。分区操作结束后,基准元素所处的位置就是它的最终位置
(3)对基准左边和右边两个子集重复(1)和(2),直到所有子集只剩下一个元素为止

具体操作步骤
(1)把基准元素移到尾部,或者选择最后一个元素作为基准
(2)定义变量i和storeIndex,从左到右循环
(3)如果a[i] < pivotValue; 交换位于storeIndex和位置i的元素

时间复杂度O(nlogn)

代码如下:

    @Test
    public void test() {
        int[] array = {3, 7, 8, 5, 2, 1, 9, 5, 4};
        quickSort(array, 0, array.length-1);
    }


    private void quickSort(int[] array, int left, int right) {
        if (right <= left) {
            return;
        }
        int pivotNewIndex = partition(array, left, right, right);
        quickSort(array, left, pivotNewIndex - 1);
        quickSort(array, pivotNewIndex + 1, right);
    }

    //pivotIndex 初始为任意选择的数组index
    //初始left=0;right=length
    private int partition(int[] array, int leftIndex, int rightIndex, int pivotIndex) {
        int pivotValue = array[pivotIndex];

        //交换pivotIndex与rightIndex
        swap(array, rightIndex, pivotIndex);
        int storeIndex = leftIndex;

        for (int i = leftIndex; i <= rightIndex; i++) {
            if (array[i] < pivotValue) {
                swap(array, storeIndex, i);
                storeIndex++;
            }
        }
        swap(array, rightIndex, storeIndex);
        return storeIndex;
    }
    private void swap(int[] array, int index1, int index2) {
        int tmp = array[index1];
        array[index1] = array[index2];
        array[index2] = tmp;
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值