排序算法part2(day11)

1. 归并排序

   归并排序采用的是分治法思想;

   基本思想:将待排序的元素分成大小大致相同的两个子集合,分别对两个子集合进行排序,最终将排好序的子集合合并成所要求的排序好的集合。

   ```
     public static void merge(int[] arr, int left, int mid, int right, int[] temp) {
           int i = left;
           int j = mid + 1;
           int t = 0;//临时数组的下标索引
           //先将两个部分合并
           while(i <= mid && j <= right) {
               if(arr[i] <= arr[j]) {
                   temp[t] = arr[i];
                   t++;i++;
               }
               else {
                   temp[t] = arr[j];
                   t++;j++;
               }
           }
           //如果左边的部分没有合并 则接着i继续合并
           while(i <= mid) {
               temp[t] = arr[i];
               t++;i++;
           }
           //如果右边的部分没有合并 则接着j继续合并
           while(j <= right) {
               temp[t] = arr[j];
               t++;j++;
           }
           //将temp里面的数组填充到数组的指定位置
           t = 0;
           int tempLeft = left;
           while(tempLeft <= right) {
               arr[tempLeft] = temp[t];
               t++;tempLeft++;
           }
   
       }
   
       //归并第一部分 分 
       public static void mergeSorted(int[] arr, int left, int right, int[] temp) {
           if(left < right) {
               int mid = (left + right) / 2;
               mergeSorted(arr, left, mid, temp);
               mergeSorted(arr, mid + 1, right, temp);
               merge(arr, left, mid, right, temp);
           }
       }
   ```

   

2. 基数排序

   基数排序是对传统桶排序的扩展,速度很快.基数排序是对传统桶排序的扩展,速度很快.
   基数排序法是属于稳定性的排序,基数排序法的是效率高的稳定性排序法基数排序法是属于稳定性的排序,基数排序法的是效率高的稳定性排序法

   基数排序的次数取决于最高位的位数(千位4次, 百位3次 以此类推)

   看下图例子,对{ 329, 457, 657, 839, 436, 720, 355 }进行基数排序:

   <img src="https://img-blog.csdn.net/20180405192008567?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3p4enh6eDAxMTk=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70" alt="这里写图片描述" style="zoom:67%;" />

   ```
   public static void redixSort(int[] arr) {
           int[][] bucket = new int[10][arr.length - 1];//就是桶里面所存的具体数值
           int[] bucketElementCounts = new int[10];//每个桶所存放的元素个数
           int max = arr[0];
           for (int i = 0; i < arr.length; i++) {
               if(max < arr[i]) max = arr[i];
           }
           int maxCount = (max + "").length();//先把max转成字符串 在看它的位数 就知道最大位数了
           for (int i = 0; i < maxCount; i++) {
               for (int k = 0; k < arr.length; k++) {
                   int value = arr[k] / (int)Math.pow(10, i) %10;//得到arr[k]在i的位数 如arr[0] = 19, i = 0, value = 9;
                   bucket[value][bucketElementCounts[value]] = arr[k];//例如value = 1, bucketElementCounts[1] = 0代表此时个位数为0的桶里元素数目为0,bucket[1][0] = arr[k] 含义为个位数为1的桶里第一个元素为 arr[k]
                   bucketElementCounts[value]++;
               }
               int index = 0;
               for (int k = 0; k < bucketElementCounts.length; k++) {//遍历每个桶
                   if(bucketElementCounts[k] != 0) {
                       for (int x = 0; x < bucketElementCounts[k]; x++) {
                           arr[index] = bucket[k][x];
                           index++;
                       }
                   }
                   bucketElementCounts[k] = 0;
               }
           }
       }
   ```

   

3. 堆排序

参考文献:

[各种排序算法总结(全面)-CSDN博客](https://blog.csdn.net/zxzxzx0119/article/details/79826380)

[冒泡排序_哔哩哔哩_bilibili](https://www.bilibili.com/video/BV1dV411U7VN?p=2&vd_source=66392ef2b6adca91c89d3d4e302e5a97)

[归并排序算法(java实现)_java归并排序-CSDN博客](https://blog.csdn.net/qq_45954420/article/details/123412430)

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值