A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 赵贺景 中级黑马   /  2014-6-29 09:38  /  2575 人查看  /  7 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

namespace temp
{

    public class QuickSort
    {
        /// <summary>
        /// 排序
        /// </summary>
        /// <param name="numbers">;待排序数组</param>
        /// <param name="left">;数组第一个元素索引Index</param>
        /// <param name="right">;数组最后一个元素索引Index</param>
        private static void Sort(int[] numbers, int left, int right)
        {
            //左边索引小于右边,则还未排序完成
            if (left < right)
            {
                //取中间的元素作为比较基准,小于他的往左边移,大于他的往右边移
                int middle = numbers[(left + right) / 2];
                //下标
                int i = left - 1;
                int j = right + 1;
                while (true)
                {
                    while (numbers[++i] < middle && i < right) ;
                    while (numbers[--j] > middle && j > 0) ;
                    if (i >= j)
                        break;
                    Swap(numbers, i, j);
                }
              //递归排,直到循环结束
                Sort(numbers, left, i - 1);
                Sort(numbers, j + 1, right);
            }
        }
        /// <summary>
        /// 交换元素值
        /// </summary>
        /// <param name="numbers">;数组</param>
        /// <param name="i">;当前左边索引</param>
        /// <param name="j">;当前右边索引</param>
        private static void Swap(int[] numbers, int i, int j)
        {
            int number = numbers[i];
            numbers[i] = numbers[j];
            numbers[j] = number;
        }
        public static void Main()
        {
           //用随机数模拟的大数据量
            int[] max = new int[80000];
           //Random r = new Random(Guid.NewGuid().GetHashCode());
            Random r = new Random(Environment.TickCount);
            for (int i = 0; i < max.Length; i++)
            {

                max[i] = r.Next(0, 1000000);

            }
            //秒表掐时间
            Stopwatch s = new Stopwatch();
            s.Start();
            Sort(max, 0, max.Length - 1);
        //追加到集合里
            StringBuilder temp = new StringBuilder();
            for (int i = 0; i < max.Length; i++)
            {
                temp.Append(max[i].ToString() + ",");
            }
            s.Stop();


           // Console.WriteLine(s.Elapsed);
            Console.WriteLine(temp.ToString().Substring(0, temp.Length - 1));
            Console.WriteLine(s.Elapsed);

            Console.ReadLine();
        }
    }
}直观的理解快排,就是找中间量,比之大的放右边,比之小的放左边,递归下去直到所有的数据排完。

评分

参与人数 1技术分 +1 收起 理由
czwanglei + 1

查看全部评分

7 个回复

倒序浏览
请问楼主,Sort函数中left初始值传的是0,right传的是max.lenth-1,那么    //下标                 int i = left - 1;                 int j = right + 1;,这样的话left就是-1,right就是length,数组越界!最有楼主为什么截取字符串,还请楼主指点迷津

评分

参与人数 1技术分 +1 收起 理由
czwanglei + 1

查看全部评分

回复 使用道具 举报
while (numbers[++i] < middle && i < right) ;
                    while (numbers[--j] > middle && j > 0) ;这里 ++i;是先加的从单步调试可以知道  i的变化过程是 -1   0  1   递增 不会报错
substring(位置,长度)只是为了输出stringBuileder 而已

回复 使用道具 举报
快速排序 是采用递归的方式对待排序的数列进行若干次的操作,每次操作使得被操作的
数列部分以某个元素为分界值分成两部分,一部分小于该分界值,另一部分大于该分界值。
基本思想是:快速排序是对冒泡排序的改进,基本思想是:在 n 个记录中任取一个记录(常取第一个记录),把该记录放到最终位置,所有记录与它比较,比之小的放在前半部分,比之大的放在后半部分,该记录放在两部分之间,这一过程称为一趟排序;对前后两部分重复上述过程,直到每部分只一个记录为止。

评分

参与人数 1技术分 +1 收起 理由
czwanglei + 1

查看全部评分

回复 使用道具 举报
赵贺景 发表于 2014-6-29 10:45
while (numbers[++i] < middle && i < right) ;
                    while (numbers[--j] > middle && j  ...

我试了一下,把代码改成 Console.WriteLine(temp);也能正常输出,感觉没必要进行截取

评分

参与人数 1技术分 +1 收起 理由
czwanglei + 1

查看全部评分

回复 使用道具 举报
The_Enternal 发表于 2014-6-29 19:06
我试了一下,把代码改成 Console.WriteLine(temp);也能正常输出,感觉没必要进行截取

...

改变输出方式只是一种形式而已,计算过程中如果不断的进行屏幕绘制是比较消耗资源的
回复 使用道具 举报
你好,这种帖子应该编辑为资源分享,不应该写为版块活动、
回复 使用道具 举报
有点晕,先把代码复制下来慢慢研究!
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马