int[] nums = {7,19,98,3,2,11}; int temp;// 空集 int num =1;// 要插入的元素 int index=nums.length-1;// 默认插入的位置在数组最后一位 // 如果仅依靠for(j)单次遍历,得到的排列为 {19,98,11,7,3,2}。“19,98”其实并未作比较 for(int k=0;k<nums.length;k++){ // 遍历数组内的元素,进行降序排列 for(int j=0;j<nums.length-1;j++) { //注意:是"nums.length-1",不是"nums.length"。 if (nums[j] < nums[j + 1]) { temp = nums[j]; nums[j] = nums[j + 1]; nums[j + 1] = temp; } } } // 打印降序排列后的元素,应为{98,19,11,7,3,2} System.out.println("降序:"); for (int j=0;j< nums.length;j++){ System.out.println(nums[j]); } // 找到 num 插入的位置 for(int i=0;i<nums.length;i++){ if(num>nums[i]){ // 找到位置 index=i; break; } } // 将index位置之后的元素向后移一位 for(int i=nums.length-1;i>index;i--){ nums[i]=nums[i-1]; } // 插入元素 nums[index]=num; System.out.println("插入后的元素排序:"); for(int i=0;i<nums.length;i++){ System.out.print(nums[i]+","); }
// 打印结果为{98,9,11,7,3,1}
元素 “2” ,不见了 ? 往下看要点
元素插入的操作是1:先找到插入的位置;
2:然后排在该位置后面的元素后移,空出该位置,必有一个元素被移出;
3:再插入元素。
这就是为什么程序打印出来后没有元素 “2” 的原因,“2”在降序排列后,作为最后一位被移出。
要点:该程序一共用到两种方法——降序排列和插入。且先降序,再插入;如果操作顺序颠倒,那么势必要先移出一个元素,被移出的元素不一定比插入的元素小。以上述的程序举例,最终得到的结果会是{98,19,7,3,2,1},元素“11”在插入时被移出了。
值得注意的是降序循环一共两层——内层为单次循环,且所得结果并非完全降序排列;为了将所有元素进行对比,就要加一层外循环,即程序中的 for( k )。