int[] arr = new int[14] { 12, 15, 13, 51, 26, 48, 14, 61, 57, 45, 62, 43, 3, 51 };
            for (int i = 0; i < arr.Length; i++)//冒泡的次数
            {
                for (int j = 0; j < arr.Length-1-i; j++)//每次冒泡的具体算法
                {
                    if (arr[j] > arr[j + 1])
                    {
                        int temp = arr[j];
                        arr[j] = arr[j + 1];
                        arr[j + 1] = temp;
                    }
                }
            }
            foreach (int n in arr)
            {
                Console.WriteLine(n + " ");
            }
            Console.ReadLine();
各位高手好!小弟刚入门!编写了一个关于冒泡排序的控制台应用程序!
小弟想问一下!在上面的程序中每次冒泡的具体算法的那一行为什么要j<arr.Length-1-i呢?请各位高手解释一下!
百度上查不出来!

解决方案 »

  1.   

    你不j<arr.Length-1-i是因为在上一次的循环已经有i个数据排好序了,不需要再if (arr[j] > arr[j + 1]) 比较一次。
    你用j<arr.Length-1也是可以的。
      

  2.   

    第一次i==0;比较的结果是arr[13]放了最大的数。
    第二次i==1;arr[13]不参加比较了,将次大的数放在arr[12]。
    以此类推。
      

  3.   

    外循环每执行一次,就会找到最大数,下次循环就已找到的最大数排除不再参与对比,所以内循环次数要减一,”arr.Length-1-i“中arr.length-1是内循环第一次的最大次数。因为内循环每次有两个数参与,所以内循环次数是arr.Length-1次