算法学习之路(2)——快速排序

快速排序的基本思想:
  1)对任意给定的序列中元素Rs(关键字为Ks),经过一趟排序后,将原序列分割成两个子序列:
  2)前一个子序列中的所有元素的关键字均小于等于Ks ,
  3)后一个子序列中元素的关键字均大于等于Ks。
  4)称元素Rs 为分割元素
  5)以后只需对2个子序列分别以同样的算法进行快速排序,直到子序列为空或只有一个元素时得到有序序列。
  算法可以用递归来实现。

  a)  i从左向右找第1个大于等于分割元素的元素。
  b)  j从右向左找第1个小于或等于分割元素的元素。
  c)  i<j时,a[i]、a[j]交换;继续扫描,当i>=j时,此趟排序结束
  本质上:大的元素调整到右边,小的元素调整到左边

算法实现:

(1)定义一个快排函数quicksort;

函数声明:

  void quicksort(int* source,int left,int right);

  @param source 源数组

  @param left 数组起始索引

  @param right 数组末端索引

函数实现:

  

void quicksort(int* source,int left,int right){
    if(left<right){
        int i = left;
        int j = right + 1; //A[left]为分割元素
        do{
            do{
                i++;
             }while(i < right && source[left]>source[i]);//i从左向右找第1个大于或等于分割元素的元素
            do{
                j--;
            }while(j > left && source[left]<source[j]);//j从右向左找第1个小于或等于分割元素的元素
            if(i<j){
                swap(source[i],source[j]);
            }
        }while(i<j);//i<j时,继续扫描,i>=j时,此趟排序结束
        swap(source[left],source[j]);    
        quicksort(source,left,j-1);//对分割元素左端序列快速排序  
        quicksort(source,j+1,right);//对分割元素右端序列快速排序 
    }
}

(2)调用quicksort

函数声明:

  void quicksort(int* source,int length);

  @param source 源数组

  @param length 数组长度

函数实现:

  

void quicksort(int* source,int length){
    quicksort(source,0,length-1);
}

实验

测试代码:

int main(){
    int* a = new int[20]{ 1, 5, 2, 3, 6, 43, 7, 2, 7, 5, 87, 65, 32, 45, 12, 64, 31, 33, 22, 6 };
    quicksort(a,20);
    for (int i = 0; i < 20; i++){
        cout << a[i] << " ";
    }
  delete [] a; }

实验结果:

 

posted @ 2015-10-26 16:20  珞珈小学子  阅读(251)  评论(0编辑  收藏  举报