数组的排序 七大排序

七大排序

  • 交换排序
  1. 冒泡排序
  2. 快速排序
  • 插入排序
  1. 直接插入排序
  2. 希尔排序
  • 选择排序
  1. 直接选择排序
  2. 堆排序
  • 归并排序

1、冒泡排序

每次比较相邻的两个元素,将较大的元素后移,每当将数组的数比较一次,最大的数都会出现在数组的最后,再对除去最后面数的前面的数进行重复操作,操作arr.length-1次即可

代码如下:

private static void bubbleSort(int[] arr){
    
    for (int i = arr.length - 1; i > 0; i--){
        
        for (int j = 0; j < i; j++){

            // 相等不交换,保证稳定性
            if (arr[j] > arr[j+1]){
            
                swap(arr, j, j+1);

            }

        }
    }

}


private static void swap(int[] arr, int a, int b){
    
    int temp = arr[a];
    arr[a] = arr[b];
    arr[b] = temp;
    
}

2、快速排序

随机选择一个基准(一般选择第一个数),再设置两个辅助“指针”:i,j,i是第一个元素的index,j为最后一个元素的index。首先j开始向前移动,直到找到第一个比基准小的数index为止,然后i向后移动,直到找到第一个比基准大的数的index为止,交换i,j位置的元素;再重复上述操作,直到i>=j为止,此时将基准的值与i位置的值交换。则左边的都是比基准小的值,右边都是比基准大的值。再对左右两边进行同样的操作。

代码如下:

/**
 *
 *  快速排序:选择一个元素作为基准(一般选择第一个元素),begin指向开头,end指向末尾
 *           end负责找出比基准小的第一个元素,找出后,begin找出第一个比基准大的元素
 *           交换两个元素,以此类推,直到begin和end碰到,交换基准与该位置的元素;
 *           此时,该位置的左边是比基准小的元素,右边是比基准大的元素;以该位置作为
 *           分隔点,对左边和右边进行相同的操作;当begin大于等于end的时候,跳出递归
 *
 * @param arr   目标数组
 * @param begin 开始位置
 * @param end   结束位置
 */
private static void quickSort(int[] arr, int begin, int end){

    if (begin >= end){

        return;

    }
    
    int standard = arr[begin];
    int i = begin;
    int j = end;
    
    while (i < j){
        
        while (i < j && arr[j] >= standard){
            
            j--;            

        }

        while (i < j && arr[i] <= standard){
            
            i++;            

        }
        
        if (i < j){
            
            swap(arr, i, j);            

        }
        
    }
    
    swap(arr, begin, i);
    
    quickSort(arr, begin, i-1);
    qucikSort(arr, i+1, end);

}
  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值