快速排序的实现--挖坑法

来源:互联网 发布:de beers 知乎 编辑:程序博客网 时间:2024/06/06 02:12
//*********************挖坑法(快排的一种实现方式)************************
intPartSort(int*a,intleft,intright)
{
                intkey =a[right];
                intbegin =left;
                intend =right;

                while(begin < end)
                {
                                while(begin < end &&a[begin] <= key)//begin找比key大的
                                                begin++;

                                if(begin < end)     //找到且begin < end则把begin的值给end,begin成为新的坑
                                                a[end] =a[begin];

                                while(begin < end &&a[end] >= key) //end找比key小的
                                                end--;

                                if(begin < end)   //找到且begin < end则把end的值给begin,end成为新的坑
                                                a[begin] =a[end];
                }

                //出了循环:end可能和begin指向同一个,把key的值给begin或者end都可以
                //          end比begin小,则begin的位置一定是key的位置
                //此处不做判断,所以直接把key的值给a[begin]
                a[begin] = key;
                returnbegin;
}

voidDigHoles(int*a,intleft,intright)
{
                assert(a);
                if(left>=right)
                                return;
                intmid = PartSort(a,left,right);

                DigHoles(a,left, mid - 1);
                DigHoles(a, mid + 1,right);
}

voidDigHolesTest()
{
                                   //int arr[] = { 2, 0, 4, 9, 3, 6, 8, 7, 1, 5 };
                                   intarr[] = { 2, 5, 4, 9, 3, 5, 8, 7, 1, 5 };
                                                int_size =sizeof(arr) /sizeof(arr[0]);

                                                DigHoles(arr, 0, _size - 1);
                                                Print(arr, _size);
}
0 0