ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

2022-07-22 第4组 蒋萍 三种排序

2022-07-22 22:02:58  阅读:162  来源: 互联网

标签:arr 07 22 int 蒋萍 i1 length 排序 比较


排序

目录

插入排序

从小到大排列:

通过构建有序序列,对未排序的数据,在已排序序列中从后向前扫描 ( 从current开始从后向前 ),在第一个比current小的数的后面插入。

1、在哪插入??

2、怎么插入??移位问题

/*
	插入排序:
            假设数组是从小到大排序的,
            拿着第一个数(参照数)和后面的比较,
            发现比参照数小,就往这个参照数前插入,其余的往后移(注意不要覆盖)
*/
int[] arr = new int[]{1, 25, 48, 12, 10, -8, 127,56};
// 参照数,和它前一个比较
int current;
for (int i = 0; i < arr.length - 1; i++) {
    current = arr[i + 1];
    // 上一个数的下标
    int preIndex = i;
    // 上一个数的下标不能出现负数,确保在数组范围内比较;当前的数比前一个数小,当前数才能往前移位
    while (preIndex >= 0 && current < arr[preIndex]){
        // 前一个数往后移一位,
        arr[preIndex + 1] = arr[preIndex];
        // 后面的数怎么往前移呢??
        preIndex--;// preIndex=-1时,循环终止,此时,这个数就是在第一位,
    }
    arr[preIndex + 1] = current;
}

image-20220722215416370

选择排序

把一个数,和所有的数比较,把小的往前面放

/* 选择排序 :
        最小的往前放
        或者把最大的放在最后,方法同上面的类似
*/

/* 1、第一轮,找到整个数组中最小的值,然后把这个最小的值和第一位换位;
            假设第一个数(下标为0)就是最小的数,然后让这个数和每个数都比较
            当发现比它小的数(下标为x),然后用这个下标为x的数继续比较下去
   2、第二轮找到第二小的那个数,和第2个位置的数换位;
   3、……一直做下去

        》该走第几轮,定义的 minIndex就是几,就是从哪开始

 */
 int[] arr = new int[]{1, 24, 5, 688, 98, 2, -23};

 // 外层控制轮数
 // 注意:这里arr.length后面不能减 1
 for (int i = 0; i < arr.length; i++) {
     // 最小数的下标
     int minIndex = i;
     for (int i1 = i + 1; i1 < arr.length; i1++) {
         // i1 = i + 1 ???  i = 1 的时候已经不用比较前一位了,
         // 直接从 i+1 开始即可(前面的已经排好序了)
         //    》该走第几轮,定义的 minIndex就是几,就是从哪开始
         if (arr[minIndex] > arr[i1]) {
             // 换位
             minIndex = i1;
         }
     }
     int tmp = arr[minIndex];
     arr[minIndex] = arr[i];
     arr[i] = tmp;
     System.out.println("第" + (i + 1) + "次比较结果为:");
     for (int i1 : arr) {
         System.out.print(i1 + "、");
     }
     System.out.println();
 }

插排和选排的区别

  • 插排从无序列表中取第一个数,与有序列表的数依次比较
  • 选排从无序列表中取最小(大)数放在起始位,再从剩余无序中找最小(大),只和无序列表中第一个数交换

冒泡排序

每一轮排序都是从头开始,用前一个数和后一个数比较,大的往后放,

每次比较后,都是大的那个继续和后一个比较,第一轮比较可以找到第一大的数

以此类推……

/*  *//* 冒泡排序 *//*
// 从小到大:
*//*思路分析:
 *       先拿第一个数和后面的数一一比较大小;
 *       第一轮比较完成后,最大值已归位,
 *       第二轮比较得第二大的数,
 *       一直做下去
 *
 * *//*
 /*冒泡排序需要两层循环嵌套:for
 * 外层for循环控制需要各个数之间要比较得轮数
 * 内层for循环控制每个数的比较
 */
int[] arr = new int[]{1,23,5,675,57};
// 比较轮数是arr.length - 1
for (int i = 0; i < arr.length - 1; i++) {
    // 数组中数的比较
    for (int j = 0; j < arr.length - 1 - i; j++) { 
        // 注意越界问题,每轮结束,右边就会固定一个,
        if (arr[j] > arr[j+1]){ // 从大到小排序的话这就变小于号
            // 前面的数大于它的后一个,换位
            int tmp = arr[j];
            arr[j] = arr[j+1];
            arr[j+1] = tmp;
        }
    }
    System.out.print("第" + (i + 1) + "轮的比较结果为:");
    for (int j : arr) {
        System.out.print(j + "、");
    }
    System.out.println( );
}

// 简便操作(只能从小到大排~~)
Arrays.sort(arr);*/

我的注意

  • 数组中交换元素位置需要用到临时变量

  • 边界问题: j < arr.length - 1 - i:因为i控制的是比较轮数,每一轮都会在最右边固定一个数(那就会少比较一个数),所以后面会减i

插排和选排,第一次看还有点懵,找到区别后才明白过来,嘿嘿,继续努力,不盲目和他人作比较,踏实走好每一步很重要喔~~~

标签:arr,07,22,int,蒋萍,i1,length,排序,比较
来源: https://www.cnblogs.com/fulfill/p/16508105.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有