【Algorithm】快速排序(续)

  前面在常用的排序算法中,已经写过一篇关于快速排序算法的博客,但是最近看到《The C Programming Language》这本书中的快速排序算法写的不错,所以就拿过来分享一下,下面我们来看一下吧。
  快速排序算法是C. A. R. Hoare于1962年发明的。快速排序思想是:对于一个给定的数组,从中选择一个元素,以该元素为界将其余元素划分为两个子集。一个子集中的所有元素都小于该元素,另一个子集中的所有元素都大于或等于该元素。对这样两个子集递归执行这一过程,当某个子集中的元素数小于2时,这个子集就不需要再排序,终止递归。
  从执行速度来讲,下列版本的快速排序函数可能不是最快的,但它是最简单的算法之一。在每次划分子集时,该算法总是选取各个子数组的中间元素。

/*=============================================================================
#
#     FileName:   fastSort.c
#     Algorithm:  快速排序
#     Author:     Knife
#     Created:    2014-06-27 16:35:36
#
=============================================================================*/
#include <stdio.h>    
/* swap函数:交换v[k]与v[j]的值 */   
 void swap(int v[], int k, int j)   {    
    int temp;   
    temp = v[k];   
    v[k] = v[j];  
    v[j] = temp;   
}    
/* 快速排序 */
void qsort(int v[], int left, int right)   {
    int j, last;    
    if (left >= right){                 /* 若数组包含的元素个数少于两个,则return */   
        return;
    }
    swap(v, left, (left + right)/2);    /* 将划分子集的元素移动到v[left] */   
    last = left;                           
    for (j = left+1; j <= right; j++){  /* 划分子集 */ 
        if (v[j] < v[left]){    
            swap(v, ++last, j);    
        }   
    }    
    /* 将分割点left放到last的位置,这样可以保证现在序列为【小小...小[关键字]大大...大】 */
    swap(v, left, last);                
    /* 分别对分割点的左右子集进行递归 */
    qsort(v, left, last-1);  
    qsort(v, last+1, right);   
}    

void main()   {   
    int j;    
    int arr[] = {14,10,11,5,6,15,0,15,16,14,0,8,17,15,7,19,17,1,18,7};  
    qsort(arr, 0, 19);   
    for(j=0; j<=19; j++){    
        printf("%d ", arr[j]);
    }    
    printf("\n");   
}

 

posted @ 2014-06-27 16:50  NW_KNIFE  阅读(482)  评论(0编辑  收藏  举报