快速排序 从理解到掌握

来源:互联网 发布:帝国全面战争 知乎 编辑:程序博客网 时间:2024/06/07 21:48
首先我们先来看下快速排序算法的原理:


【1】从数组中取得一个“标志数字”(没有要求,可以随便取,一般取第一个);定义两个位置变量 “i” ,“j” ;“i” 左边找大于等于“标志数字”的数 ,“i”从右边找小于等于“标志数字”的数;找到后两者交换位置 
【2】直到以该数字为标志, 实现该数字的左边都是小于等于该数字的数,右边都是大于等于该数字的数
【3】然后对该标志位左边和右边的部分数组分别指向上面两步
例如: 1,2,3,5,0,1
【1】取的数字 1 为“标志数字” 任意取 那个都行 一般默认数组第一个数字
【2】第 一 次寻找 两边的1 相互交换位置 注意 这时的“标志数字”是后一个1 
【结果】 1 2 3 5 0 1; 
【2】第 二 次【这时i++了一次j--了一次】寻找第一个小于等于的“标志数字”的值为(0) 大于等于的为(2) 交换位置
【结果】 1 0 3 5 2 1; 
这是i j已将相遇 (i>=j)
在相遇位置 数字3 左边都是小于等于“标志数字”的 右边都是大于等于“标志数字”的
【3】将数组分为 1 0 - 3 5 2 1两个子数组递归调用【1】【2】
【1】取的数字 1 为“标志数字”
【2】寻找左开始寻找大于等于1的找到(1) 又开始寻找小于等于1的找到(0)
【结果】 0 1 - 3 5 2 1
【1】取标“标志数字”3 
【2】找到3 1交换位置
【结果】 0 1 - 1 5 2 3
【2】找到5 2交换位置
【结果】 0 1 - 1 2 5 3
【3】递归排序1 2  -5 3
...
【1】标志数字 5
【2】 找到5 3交换位置 
【结果】 0 1 - 1 2 - 3 5

【4】直到最后每个子数组的成员只有一个 排序完成

 static void QuickSort(int[] num, int l=0, int r=0)        {            if (r == 0)                r = num.Length - 1;            int i = l;            int j = r;            int sign = num[i];                      while (i<= j )            {                if (num[i] < sign)                    i++;                else if (num[j] > sign)                    j--;                else                {                                      int tmp = num[i];                    num[i] = num[j];                    num[j] = tmp;                    #region 中间为调试输出的内容 以方便大家查看每次的交换情况                    Console.ForegroundColor = ConsoleColor.White;                    Console.Write("i={0},j={1},sign={2},时{3}和{4}交换;", i,j, sign,num[j], num[i]);                    Console.WriteLine();                    for (int z = 0; z < num.Length; z++)                    {                        if (z == i || z == j)                            Console.ForegroundColor = ConsoleColor.Red;                        else                            Console.ForegroundColor = ConsoleColor.White;                                               Console.Write(num[z]+"  ");                    }                    Console.WriteLine();                    #endregion                    i++;                    j--;                }            }            if (l < j)                QuickSort(num, l, j);            if (r > i)                QuickSort(num, i, r);        }



 
原创粉丝点击