基础排序算法

简介: 基础排序算法

  • 排序算法总结(图片CV的)
  • 快速排序

基本思想:分而治之、挖坑填数

基本实现原理如下

  1. 首先选取target目标作为参考数字
  2. 然后将数组中所有的数据与target比较,比target小的置于左边,比target大的,置于右边,形成两个区间。
  3. 重复1、2步,直到数组的所有子区间的大小为1为止
  • 例子如下:
  • 设存在数组为[30,40,60,10,20,50],取第0个元素为target元素
  • 伪代码描述如下:
  1. 设置初始参考值为target=arr[0],设置两个指针left=0,right=arr.length-1
  2. right--移动右边界索引,直到出现arr[right]<target时,此时填坑将arr[left]=arr[right],然后left++
  3. left++移动左边界索引,直达出现arr[left]>target时,此时填坑将arr[right]=arr[left],然后right--
  4. 重复b,c操作,直到left==right,将arr[left]=target
  • 代码如下:
/**
 * @param arr   待排序数组
 * @param left  左边界,一般是0
 * @param right 右边界,一般是arr.length-1
 */
public static void quickSort(int[] arr, int left, int right) {
    if (left < right) {
        int l = left, r = right, target = arr[left];//如果设置target在左边,则必须保证从right开始搜索
        while (l < r) {
            while (l < r && arr[r] > target) r--;//从target相反方向(右边)搜索第一个小于target的
            if (l < r) arr[l++] = arr[r];
            while (l < r && arr[l] < target) l++;//从target相同方向搜索第一个大于target的
            if (l < r) arr[r--] = arr[l];
        }
        arr[l] = target;//填坑
        quickSort(arr, left, l - 1);
        quickSort(arr, l + 1, right);
    }
}
  • 归并排序

基本思想:分而治之,先拆开后合并,由局部子序列有序推导出序列整体有序

基本实现原理如下

  1. 首先将需要排序的数组每次都对半拆分,直到每个序列都只有一个元素
  2. 而后进行合并操作,将arr[left...mid],arr[mid+1...right]合并
  3. 合并过程中,将arr[left...mid],arr[mid+1...right]每个元素进行比较,按照递增或者递减顺序存放进newArr
  4. 重复以上2、3步骤,直到到达递归树顶层
  • 具体过程如下:
  • 数组分组
  • 数组治理
  • 数组合并过程
  • 归并排序代码

 

/**
     * 归并排序
     *
     * @param arr
     * @param left
     * @param right
     * @return
     */
    public static int[] MergeSort(int[] arr, int left, int right) {
        //递归树最底层,也就是递归出口
        if (left == right) return new int[]{arr[left]};
        //递归划分局部区间
        int middle = (left + right) / 2;
        int[] leftNums = MergeSort(arr, left, middle);//分割左区间
        int[] rightNums = MergeSort(arr, middle + 1, right);//分割右区间
        //构建结果集
        int[] temp = new int[leftNums.length + rightNums.length];
        int l = 0, r = 0, m = 0;
        while (l < leftNums.length && r < rightNums.length) {
            //对temp[l]以及temp[r]比较,构建有序序列
            //如果leftNums[l]>rightNums[r],则temp[m]=rightNums[r];然后temp++,r++
            temp[m] = leftNums[l] > rightNums[r] ? rightNums[r++] : leftNums[l++];
            m++;
        }
        //对于剩余的待比较序列进行排序
        while (l < leftNums.length) {
            temp[m] = leftNums[l];
            m++;
            l++;
        }
        while (r < rightNums.length) {
            temp[m] = rightNums[r];
            m++;
            r++;
        }
        return temp;
    }
• Shell排序

基本思想:增量逐渐缩小

基本实现原理如下

  1. 首先取target=arr.length/2为参考增量,每次将target减半
  2. 由arr[i]与arr[i-target]比较,若i-target大于i,则i-target后移
  3. 重复1、2操作,直至target=1
  4. shell排序过程
  • 具体实现代码如下:

   

/**
     * 希尔排序
     *
     * @param arr
     */
       public static void shellSort(int[] arr) {
        int target = arr.length;
        //arr的数字匹配距离
        for (int i = target / 2; i > 0; i = i / 2) {
            //分组数字配对
            for (int j = 0; j < i; j++) {
                for (int k = j + i; k < target; k = k + i) {
                    //如果arr[k-i]>arr[k],则arr[k-i]后面的数据全部后移
                    if (arr[k - i] > arr[k]) {
                        int temp = arr[k];
                        //以i为距离,寻找同组数据
                        int index = k - i;
                        while (index >= 0 && arr[index] > temp) {
                            arr[index + i] = arr[index];
                            //改变距离
                            index = index - i;
                        }
                        //填坑
                        arr[index + i] = temp;
                    }
                }
            }
        }
    }
目录
打赏
0
0
0
0
2
分享
相关文章
C语言:二级指针简介
二级指针即为二级指针变量,用于存放一级指针变量的地址。 一级指针变量是用来存放普通变量的地址(地址其实就是一些数字),一级指针变量也是一个变量,存放普通变量地址的同时自身也是有地址的。那么一级指针变量的地址就需要二级指针变量来存放。
135 0
com.alibaba.fastjson.JSONException:expect':'at 0 ,actual = 是什么导致的?
com.alibaba.fastjson.JSONException:expect':'at 0 ,actual = 是什么导致的?
1604 3
未来技术趋势:人工智能与物联网的融合
【8月更文挑战第15天】本文深入探讨了人工智能(AI)与物联网(IoT)的结合如何引领技术革新,重塑行业格局。通过分析AI和IoT各自的发展趋势及其交汇点,我们揭示了这一融合对智能家居、工业自动化、健康医疗等领域带来的变革。文章还讨论了在追求这些先进技术时可能遇到的挑战和道德问题,为读者提供了一幅未来技术发展的蓝图。
深入理解Java中的this关键字
深入理解Java中的this关键字
306 0
阿里云服务器99元是真的吗?真的,假不了
阿里云服务器99元是真的吗?真的,假不了,阿里云服务器99元一年配置为云服务器ECS经济型e实例,2核2G配置、3M固定带宽和40G ESSD Entry系统盘,新用户和老用户均可买,续费也是99元一年。
适配器模式:C++设计模式中的瑞士军刀
适配器模式:C++设计模式中的瑞士军刀
140 0
AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等