• 冒泡/快速排序


        protected void Page_Load(object sender, EventArgs e)
        {
            int[] ary = new int[11] { 5, 4, 33, 6, 7, 2, 45, 34, 56, 76, 34 };
            //bubbleSort(ary);
            QuickSort(ary, 0, ary.Length - 1);
            for (int i = 0; i < ary.Length; i++)
            {
                Response.Write(ary[i].ToString() + " ");
            }
        }

        /// <summary>
        /// 冒泡排序
        /// 将第一个记录ary[0]与第二个记录ary[1]比较,若前者大于后者,则两则交换位置。
        /// 然后,对新的第二个记录ary[1]和第三个记录ary[2]比较,做同样的处理。
        /// 依此类推,直到处理完第n-1个记录和第n个记录。
        /// 经过这次起泡,n个记录中最大者被安置到第n个位置上。
        /// 此后,再对前n-1个记录进行同样处理,使n-1个记录中的最大者被安置到整个序列的第n-1个位置上。
        /// 然后,再对前n-2个记录重复上述过程...这样最多做n-1次起泡就能完成排序。
        /// </summary>
        /// <param name="ary"></param>
        /// <returns></returns>
        private void bubbleSort(int[] ary)
        {
            int tmp;
            bool bDone;
            for (int i = 0; i < ary.Length; i++)  //起泡次数
            {
                bDone = true;
                for (int j = 0; j < ary.Length - i - 1; j++)  //每次起泡,比较从ary[0]到ary[n-i]的记录
                {
                    if (ary[j] > ary[j + 1])
                    {
                        tmp = ary[j];
                        ary[j] = ary[j + 1];
                        ary[j + 1] = tmp;
                        bDone = false;
                    }
                }
                if (bDone) break; //本趟起泡未发生记录交换,算法结束
            }
        }

        /// <summary>
        /// 快速排序
        /// </summary>
        /// <param name="ary"></param>
        /// <param name="begin"></param>
        /// <param name="end"></param>
        private void QuickSort(int[] ary, int begin, int end)
        {
            if (begin >= end) return;
            int i = QuickSort_Once(ary, begin, end);
            QuickSort(ary, begin, i - 1);   //对左边排序
            QuickSort(ary, i + 1, end);  //对右边排序
        }
        /// <summary>
        /// 一次快速排序
        /// 在待排序的n个记录中取第一个记录,把所有小于该记录的记录移到其左边,大的移到右边
        /// </summary>
        /// <param name="ary"></param>
        /// <param name="begin"></param>
        /// <param name="end"></param>
        /// <returns></returns>
        private int QuickSort_Once(int[] ary, int begin, int end)
        {
            int i = begin, j = end;
            int tmp = ary[i];      //保存第一个元素,相当于留空第一个位置
            while (i < j)
            {
                while (ary[j] >= tmp && i < j) j--;  //当右边的元素大于tmp时,继续向左扫描
                ary[i] = ary[j];  //此时找到了由右至左扫描的第一个小于tmp的元素,把此元素放到上一个空位里,相当于j位置留空

                while (ary[i] <= tmp && i < j) i++;  //当左边的元素小于tmp时,继续向右扫描
                ary[j] = ary[i];  //此时找到了由左至右扫描的第一个大于tmp的元素,把此元素放到上一个空位里,相当于i位置留空
            }
            ary[i] = tmp;  //此时i=j
            return i;  //得到传入数组ary的首元素的最终位置
        }

  • 相关阅读:
    最近遇到了这个坑,特意记录下
    《java8实战阅读笔记》
    Namespace的简讲
    发展历程C++及C++与C语言的关系
    进程间通信的概述2
    本来调试无误的程序在真机运行时报标题错误解决方案
    navagationController 的子控制器如何取消右滑返回
    iOS常见的设计模式
    代码:Masonry 第三方框架
    Autolayout的在storyboard警告和错误
  • 原文地址:https://www.cnblogs.com/vipcjob/p/1706709.html
Copyright © 2020-2023  润新知