很受打击啊啊啊啊啊!!!这道排序题我很久之前就做过,而且当时没用20分钟就搞定了,可是,今天在公司做完手上的活之后打算刷题时,又心血来潮的想重做一遍,心想反正也花不了多少时间,结果。。。。。血崩了。。。

代码

要求:

对于一个int数组,请编写一个快速排序算法,对数组元素排序。
给定一个int数组A及数组的大小n,请返回排序后的数组。
测试样例:

[1,2,3,5,2,3],6
[1,2,2,3,3,5]

程序:

实现方案一
class QuickSort {
public:
    int* quickSort(int* A, int n) {
        // write code here
        if(n<2){
            return A;
        }
         quickSortIter(A,0,n-1); 
        return A;
    }
    
private:
    void quickSortIter(int* A, int first, int last){  //最重要的是这个迭代函数的设计
        if(first<last){
            int sep = cutArray(A,first,last);
            quickSortIter(A,first,sep-1);
            quickSortIter(A,sep+1,last);
        }   
    }
    
    int cutArray(int* A, int first, int last){ //这个分割数组的方法很巧妙,但是,不太好理解,替代方案见程序实现方案二
        int reference = A[first];
        while(first<last){
            while((first<last)&&(A[last]>=reference)){
                last--;
            }
            A[first]=A[last];
            while((first<last)&&(A[first]<=reference)){
                first++;
            }
            A[last]=A[first];
        }
        A[first]=reference;
        return first;
    }
};
实现方案二
    int cutArray(int* A, int first, int last){
        int reference = first;
        int temp;
        while(first<=last){  //这里每一次都选择最后一个元素作为哨兵
         if(A[first]<=A[last]){
              temp = A[first];
             A[first] = A[reference];
             A[reference] = temp;
             reference++;
         }
            first++;
       }
        return reference-1;
    }

跪点

  • 最最重要的还是理解递归的思想,然后合理设计递归函数。

后记

最近在看左程云大神的算法公开课,讲的很好很好很好很好很好。。。。


jack2wang
753 声望27 粉丝