C#实现快速排序法

时间:2020-12-07 05:34:00

现在有数组{ 3, 6, 2, 1, 9, 5, 4, 7 }; 然后用快速排序法把他们排序

1、首先 ,取出3作为比较数据

2、从最右边往左边比较找到第一个比3小的数据,把3在数组中的位置赋值为那个数,这里向左循环到1时,1<3 把1复制到数组的第一个位置,记录此时1的位置,作为下一个填充数据的位置

3、再用3从左向右比较数据,找到第一个比3大的数据,这里是6,把6赋值给从右边比较时1的位置

4、从“1”的位置重复2,3步骤,直到从左边比较时索引 大于等于 从右边比较时的索引结束本次循环 数组变为 1 2 3 6 9 5 4 7

5、第二轮循环,从“3” 位置开始 数组的2索引,经过第一轮分别循环,数组"3"左边的数都比"3"小,右边的数都比“3”大, 数组 1,2 ; 6,9,5,4,7用1,2,3,4步骤再次循环

6、重复上述步骤,下面贴代码

       private void quick_sort1(int[] s, int l, int j)
        {
            if(l<j)
            {
                int i = test1(s, l, j);
                quick_sort1(s, l, i - );
                quick_sort1(s, i+, j);
            }
        }
        private int test1(int []list,int i_start,int i_end)
        {
            int i_Now = list[i_start];//取出第一个比较数
            int i_front =i_start; //保存从左边遍历的位置
            int i_brak = i_end;   //保存从右边遍历的位置
            ; ii < i_end; ii++)
            {
                for (int i = i_brak; i > i_front; i--)  //从最右边开始遍历,满足循环到的数大于i_Now(取出的数),比较向左边移动
                {
                    if (list[i] < i_Now && i >= i_front)//当遍历到的数小于i_Now(比较数)并且当前位置大于左边遍历的位置
                    {
                        list[i_front] = list[i];         //把此时的遍历到的数填充到i_Now的位置,这时数组为 1 6 2 1 9 5 4 7 ,(取出来i_Now为3,位置为数组的索引一)
                        i_brak = i;                      //这时需要填充的新的数字的位置为最开始1的位置,也就是数组索引3的位置
                        i_front++;                       //给左边遍历的位置加一,因为数组第一个位置现在有数字了
                        break;
                    }
                    else
                    {
                        continue;
                    }
                }
                for (int j = i_front; j <= i_brak; j++)  //从右边遍历结束后再从左边开始遍历,使用的数字依旧为i_Now,此时需要填充的位置为数组索引3的位置
                {                                        //从左边数值找到大于i_Now并且索引位置小于第一从从右边循环结束的位置 也就是数组索引为3的位置
                    if (list[j] > i_Now && i_brak > j)
                    {
                        list[i_brak] = list[j];         //将此时遍历到的数填充到第一次遍历移动数字的初始位置,也就是数组索引为3的位置
                        i_front = j;                    //此时数组为 1 6 2 6 9 5 4 7
                        i_brak--;                       //给右边遍历的位置减一,因为数组第i_brak个位置现在有数字了
                        break;
                    }
                    else
                    {
                        continue;
                    }
                }
            }                                            // ==》 重复上面的步骤  先从右往左找 数组变为 1 2 2 6 9 5 4 7,从左往右找时发现i_front >=i_brak
            list[i_front] = i_Now;                       //这时把最初拿出来的i_Now填充到最后i_font的位置 也就是数组索引2的位置,数组变为1 2 3 6 9 5 4 7
            ; i < list.Length; i++)        //==》经过第一轮遍历会发现“3”(i_Now)左边的数 都小于3 ,右边的数都大于3 然后继续调用排序方法
            {                                            //这时遍历分别遍历"3"两边的数组 ==>int i = test1(s, l, j);quick_sort1(s, l, i - 1);quick_sort1(s, i + 1, j); i为初始数据填充数组的位置
                textBox1.Text += list[i].ToString();
                textBox1.Text += ",";
            }
            textBox1.Text += "\r\n";
            return i_front;
        }

用个按钮触发下

        private void button1_Click(object sender, EventArgs e)
        {
            ] { , , , , , , ,  };
            quick_sort1(list, , );

        }

就这样了 ~~~~~刚刚开始接触,研究算法的菜鸟一枚,欢迎大家帮我指正错误,欢迎共同讨论、、