码迷,mamicode.com
首页 > 编程语言 > 详细

快速排序

时间:2017-07-03 16:26:14      阅读:238      评论:0      收藏:0      [点我收藏+]

标签:res   height   使用   trim   cli   实现   个数   void   start   

快速排序

排序 n 个项目要Ο(n log n)次比较。在最坏状况下则需要Ο(n2)次比较。事实上,快速排序通常明显比其他Ο(n log n) 算法更快,因为它的内部循环(inner loop)可以在大部分的架构上很有效率地被实现出来。

快速排序使用分治法(Divide and conquer)策略来把一个串行(list)分为两个子串行(sub-lists)。

算法步骤:

1 从数列中挑出一个元素,称为 “基准”(pivot),一般选择第一个

2 从后查找比pivort小的数, 从前查找比pivort大的数, 交换两个数的位置, 直到前后两个指针相遇,交换pivort 和当前指针的值

3 递归地(recursive)把小于pivoirt元素下标的子数列和大于pivort元素下标的子数列排序。

 

以下选第一个元素为pivort,查找第一个元素的位置 (详细内容:http://developer.51cto.com/art/201403/430986.htm)

技术分享

技术分享

技术分享

技术分享j > i 两者交换

技术分享   

 技术分享  j == i 与pivort(0)交换

技术分享

 

        private void QKSort_Click(object sender, EventArgs e)
        {
            Result.Text = "";    //Result 是Form 端的一个TextBox
            int[] values = { 6, 1, 2, 7,  9,  3,  4,  5, 10,  8 ,6,6,0};
            QKSort_Part(values, 0 , values.Length-1);

            for(int i =0; i< values.Length; i++)
            {
                Result.Text = Result.Text + ","  + values[i];
            }

            Result.Text = Result.Text.TrimStart(,);
        }

        private void QKSort_Part(int[] values, int from, int to)
        {
            int i = from;
            int j = to;

            if (to <= from)
            {
                return;  //递归退出条件
            }

            while (true)
            {
                var pivort = values[from];

                while (values[j] >= pivort && j > i)
                {
                    j--;
                }

                while (values[i] <= pivort && j > i)
                {
                    i++;
                }

                if (j > i)
                {
                    values[i] = values[i] + values[j];
                    values[j] = values[i] - values[j];
                    values[i] = values[i] - values[j];
                }

                if (j == i)
                {
                    values[from] = values[j];
                    values[j] = pivort;
                    break;
                }
            }

            QKSort_Part(values, from, j - 1);
            QKSort_Part(values, j + 1, to);
        }

 

快速排序

标签:res   height   使用   trim   cli   实现   个数   void   start   

原文地址:http://www.cnblogs.com/pangxiaohai/p/7111055.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!