冒泡/快速排序

    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的首元素的最终位置
    }

原文地址:https://www.cnblogs.com/vipcjob/p/1706709.html