黑马程序员技术交流社区

标题: 面试必考题之冒泡排序 [打印本页]

作者: Dangerous    时间: 2013-3-4 23:43
标题: 面试必考题之冒泡排序
            //定义一个数组
            int[] numbers = { 1, 36, 5, 6, 618, 8, 9, 3, 34, 33, 4 };
            //冒泡排序口诀:forfor,外层长度-1,内层长度-1-i
            for (int i = 0; i < numbers.Length - 1; i++)
            {
                for (int j = 0; j < numbers.Length - 1 - i; j++)
                {
                    if (numbers[j] > numbers[j + 1])
                    {
                        //交换变量
               int temp = numbers[j];
                        numbers[j] = numbers[j + 1];
                        numbers[j + 1] = temp;
                    }
                }
            }
           
           //遍历数组
            foreach (var item in numbers)
            {
                Console.WriteLine(item);
            }

  
作者: 谢玉成    时间: 2013-3-4 23:52
{:soso_e130:}好好学习>..
作者: HM张扬    时间: 2013-3-5 00:02
就这个没看懂呢

作者: 史金阳    时间: 2013-3-5 00:21
给你个升级版吧冒泡2.0版
static void Main(string[] args)
        {
            bool isExchanged = false;
            int temp;//定义一个中间变量
            int[] arr = new int[] { 1,3, 9, 27, 4, 8, 32, 11,4 };//定义一个数组,并赋值
            Console.WriteLine("排序前:");
            foreach (int m in arr)
            {
                Console.Write(m + " ");//循环遍历数组输出其中元素
            }
            Console.WriteLine();


            for (int i = arr.Length - 1; i >= 0; i--)
            {//从后往前找
                isExchanged = false;
                for (int j = i - 1; j >= 0; j--)
                {
                    if (arr[i] < arr[j])
                    {//如果后面的值小于前面的值,则交换位置
                        temp = arr[j];
                        arr[j] = arr[i];
                        arr[i] = temp;
                        isExchanged = true;
                    }
                }
                if (!isExchanged)//一遍比较过后如果没有进行交换则退出循环
                    break;
            }
            Console.WriteLine("从小到大排序后:");
            foreach (int n in arr)//循环遍历排序后的数组元素并输出
                Console.Write(n + " ");
            Console.ReadKey();
        }
作者: 岳珅    时间: 2013-3-5 05:35
金阳兄的冒泡V2.0棒棒的啊!
优化的相当好- -谢谢你!!
每次逛论坛都有新发现{:soso_e102:}
金阳兄的思路是:
比如我是1 3 2 4 5 6这样的数组,用两个for循环,会浪费好几次循环在那里做无用功,它只用循环一次就足够排序完成了。
所以金阳兄引入一个简单的isExchanged直接检测如果这一遍比较一次交换都没有进行的话,那么isExchanged的值就还是false,那么就可以判断数组已经排序完成了,可以跳出循环,不必再继续接下来的循环了。
作者: 史金阳    时间: 2013-3-7 14:04
再发个冒泡2.1 原理一样 但感觉比2.0好
            //int[] list = { 1, 0, 6, 7, 5, 9, 2, 8, 4, 3 };
            //Console.Write("排序前:");
            //// 遍历数组输出所有元素
            //for (int i = 0; i < list.Length; i++)
            //    Console.Write(list[i]);
            //Console.WriteLine();
            //int tmp = 0; // 用于交换变量
            //bool isOK = false; // 表示是否还需要排序
            //while (!isOK)
            //{
            //    isOK = true;
            //    for (int i = 0; i < list.Length - 1; i++)
            //    {
            //        // 如果下一个元素大于这个元素
            //        if (list[i] > list[i + 1])
            //        {
            //            // 交换两者
            //            tmp = list[i];
            //            list[i] = list[i + 1];
            //            list[i + 1] = tmp;
            //            // 进行了一次交换表明还需要再次排序
            //            isOK = false;
            //        }
            //    }
            //}
            //Console.Write("排序后:");
            //for (int i = 0; i < list.Length; i++)
            //    Console.Write(list[i]);
            //Console.WriteLine();




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2