排序算法4)快速排序

——SIKI学院》——


快速排序思想----分治法,它采用了一种分治的策略,通常称其为分治法。

快排是划分交换排序。

该方法的基本思想是:
1.先从数列中取出一个数作为基准数。
2.分区过程,将比这个数大的数全放到它的右边,小于或等于它的数全放到它的左边。
3.再对左右区间重复第二步,直到各区间只有一个数。


以一个数组作为示例,取区间第一个数为基准数。




初始时,i = 0;  j = 9;   X = a[i] = 72
由于已经将a[0]中的数保存到X中,可以理解成在数组a[0]上挖了个坑,可以将其它数据填充到这来。
从j开始向前找一个比X小或等于X的数。当j=8,符合条件,将a[8]挖出再填到上一个坑a[0]中。a[0]=a[8]; i++;  这样一个坑a[0]就被搞定了,但又形成了一个新坑a[8],这怎么办了?简单,再找数字来填a[8]这个坑。这次从i开始向后找一个大于X的数,当i=3,符合条件,将a[3]挖出再填到上一个坑中a[8]=a[3]; j--;
数组变为:






i = 3;   j = 7;   X=72
再重复上面的步骤,先从后向前找,再从前向后找。
从j开始向前找,当j=5,符合条件,将a[5]挖出填到上一个坑中,a[3] = a[5]; i++
从i开始向后找,当i=5时,由于i==j退出。
此时,i = j = 5,而a[5]刚好又是上次挖的坑,因此将X填入a[5]。
数组变为:

可以看出a[5]前面的数字都小于它,a[5]后面的数字都大于它。因此再对a[0…4]和a[6…9]这二个子区间重复上述步骤就可以了。



快排总结:

1.i =L; j = R; 将基准数挖出形成第一个坑a[i]。
2.j--由后向前找比它小的数,找到后挖出此数填前一个坑a[i]中。
3.i++由前向后找比它大的数,找到后也挖出此数填到前一个坑a[j]中。
4.再重复执行2,3二步,直到i==j,将基准数填入a[i]中。


 

        /// <summary>
        /// 对数组dataArray中索引从left到right之间的数做排序
        /// </summary>
        /// <param name="dataArray">要排序的数组</param>
        /// <param name="left">要排序数据的开始索引</param>
        /// <param name="right">要排序数据的结束索引</param>
        static void QuickSort(int[] dataArray, int left, int right)
        {
            if (left < right)
            {


                int x = dataArray[left];//基准数, 把比它小或者等于它的 放在它的左边,然后把比它大的放在它的右边
                int i = left;
                int j = right;//用来做循环的标志位


                while (true &&i<j )//当i==j的时候,说明我们找到了一个中间位置,这个中间位置就是基准数应该所在的位置 
                {


                    //从后往前比较(从右向左比较) 找一个比x小(或者=)的数字,放在我们的坑里 坑位于i的位置
                    while (true && i < j) {
                        if (dataArray[j] <= x) //找到了一个比基准数 小于或者等于的数子,应该把它放在x的左边
                    {
                            dataArray[i] = dataArray[j];
                            break;
                        } else {
                            j--;//向左移动 到下一个数字,然后做比较
                        }
                    }


                    //从前往后(从左向右)找一个比x大的数字,放在我们的坑里面 现在的坑位于j的位置
                    while (true && i < j) {
                        if (dataArray[i] > x) {
                            dataArray[j] = dataArray[i];
                            break;
                        } else {
                            i++;
                        }
                    }


                }


                //跳出循环 现在i==j i是中间位置
                dataArray[i] = x;// left -i- right


                QuickSort(dataArray,left,i-1);
                QuickSort(dataArray,i+1,right);
            }
        }


        static void Main(string[] args) {
            int[] data = new int[] { 42, 20, 17, 27, 13, 8, 17, 48 };
            
            QuickSort(data,0,data.Length-1);


            foreach (var temp in data) {
                Console.Write(temp + " ");
            }
            Console.ReadKey();
        }











猜你喜欢

转载自blog.csdn.net/danteshenqu/article/details/78990883
今日推荐