插入排序

点击查看代码
package Sort;
import java.util.*;
//插入排序:扑克牌从第二张开始往前排,相当于分成已排区跟待排区,已排区跟待排区的第一个元素比较。
public class 插入 {
    public static void main(String[] args) {
        int []a = {3,4,8,1,13,15,11,9,2,0};
        //排序
        for(int i=1;i<a.length;i++)
        {
            for(int j=i;j>0;j--)//跟前面的比
            {
                if(a[j]<a[j-1])//还小还往前换
                {
                    int temp = a[j];
                    a[j] = a[j-1];
                    a[j-1] = temp;
                }
                else//因为当第一次的a[j]>a[j-1]时,a[j]就必定大于前面的数了,再排序就浪费时间
                    break;
            }
        }
        System.out.println(Arrays.toString(a));
    }
}


您提供的代码并不是标准的插入排序实现。插入排序的基本思想是将数组分为已排序和未排序两部分,从数组的第二个元素开始,依次将未排序的元素插入到已排序部分的适当位置,直到整个数组排序完成。

然而,在您的代码中,您使用了两个嵌套的for循环,但它们的逻辑与插入排序不同。您的代码实际上尝试通过从后向前遍历并与前一个元素进行比较来“排序”数组,但这种方式并不符合插入排序的标准实现。特别是,当您在内层循环中检测到a[j] >= a[j-1]时,您直接break跳出内层循环,这会导致排序不完整,因为您没有确保a[j]被正确地插入到已排序部分的适当位置。

下面是一个标准的插入排序实现,供您参考:
优化

点击查看代码
package Sort;  
  
import java.util.Arrays;  
  
// 插入排序:扑克牌从第二张开始往前排,相当于分成已排区跟待排区, 已排区跟待排区的元素比较。  
public class InsertionSort {  
    public static void main(String[] args) {  
        int[] a = {3, 4, 8, 1, 13, 15, 11, 9, 2, 0};  
        // 排序  
        for (int i = 1; i < a.length; i++) {  
            int key = a[i]; // 选取未排序部分的第一个元素作为key  
            int j = i - 1;  
            // 将key插入到已排序部分的适当位置  
            while (j >= 0 && a[j] > key) {  
                a[j + 1] = a[j]; // 元素后移  
                j--;  
            }  
            a[j + 1] = key; // 插入key  
        }  
        System.out.println(Arrays.toString(a));  
    }  
}
在这个标准的插入排序实现中,我们使用了一个外部循环来遍历未排序的元素(从数组的第二个元素开始),并使用一个内部循环来将当前元素(key)与它之前的已排序元素进行比较,如果前面的元素比key大,则将前面的元素向后移动一位,直到找到key的正确位置并插入它。**注意**,在内部循环中,我们不需要在每次比较后立即break,而是应该继续向后遍历,直到找到key的正确位置或遍历完所有已排序的元素。 ![](https://img2024.cnblogs.com/blog/3504647/202409/3504647-20240929203942880-2109963105.png)
posted @ 2024-09-16 17:39  怂蛋本蛋  阅读(37)  评论(0)    收藏  举报