不知道如何使用Quicksort

时间:2011-12-25 04:51:33

标签: c++ quicksort

我正在尝试在此进行快速排序以进行研究。但我不知道如何快速查看这个算法,但不知道现在使用冒泡排序是什么或如何实现它,但我如何继续实施快速排序?

# choose pivot
swap a[1,rand(1,n)]

# 2-way partition
k = 1
for i = 2:n, if a[i] < a[1], swap a[++k,i]
swap a[1,k]
→ invariant: a[1..k-1] < a[k] <= a[k+1..n]

# recursive sorts
sort a[1..k-1]
sort a[k+1,n]   

这是我的代码

int main()
{
srand(time(NULL));
    int length = 250000;
    double arr[length];
    for(int i = 0; i<length; ++i) arr[i] = rand();
   // mergeSort2(arr, arr+length-1);


        for(int i = 0; i < (length-1); i++)
    {
        for(int j = i+1; j < length; j++)
     {
           if( arr[i] > arr[j])
            {
               swap(arr[i], arr[j]);
            }
        }
    }

    ofstream ofs("input.txt");
    for(int i = 0; i<length; ++i) ofs << i << " " << arr[i] << endl;
}

1 个答案:

答案 0 :(得分:4)

animation非常有帮助。

快速排序(Dive and Conquer)的核心就是以下几点:

  1. 选择一个元素作为支点

    • 在实践中 大部分时间 我们并不关心哪一个。正如您将通过证明看到的那样,随机选择一个支点(而不是前/后/中)将最大限度地减少遇到最坏情况的可能性。
    • 为了测试目的,挑选中间人是一个不错的选择。
  2. 分区(l =左,右=右)

    目标是将原始阵列分成两组(几乎!!)

    S_left = {x in S - {pivot}:x小于或等于pivot}

    S_right = {x in S - {pivot}:x大于或等于pivot}

    为了简化表示法:

    • a [l] .... a [i-1]小于或等于a [i]
    • a [i + 1] ... a [r]大于或等于a [i]
    • 因此,最后,[i](枢轴元素)应该在适当的位置。
  3. <强>策略

    编程QS有两种常用方法,但一般来说QS需要三个参数(Array,low,high),其中low是数组的左端索引,high是数组的右端索引(可能是2,3,5,10,不一定是0,长度为1)

    Initially
    l = low-1
    r = high
    
    advances l when A[l] less than or equal to pivot
    decrements r when A[r] is greater than or equal to pivot
    swap A[l] and A[r]
    repeat this process until l is greater than or equal to r, and swap (pivot, A[l])
    Call QuickSort(A, left, l-1)
    Call QuickSort(A, l+1, right)
    

    我给你大部分的实施。 在纸上用一个小例子(9号对我来说似乎合理)来解决。在实施正确之前不要使用rand。

    试试这个数组:

      

    myArray = 9,6,2,5,11,4,20,1,3

    我明天可以写更多。