其他分享
首页 > 其他分享> > 2022-07-22 第4组 蒋萍 三种排序

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

作者:互联网

排序

目录

插入排序

从小到大排列:

通过构建有序序列,对未排序的数据,在已排序序列中从后向前扫描 ( 从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);*/

我的注意

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

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