现在的位置: 首页 > 自动控制 > 工业·编程 > 正文

快速排序

2012-08-23 21:23 工业·编程 ⁄ 共 1479字 ⁄ 字号 暂无评论

    设当前待排序的无序区为R[low..high],利用分治法可将快速排序的基本思想描述为:
①分解:
    在R[low..high]中任选一个记录作为基准(Pivot),以此基准将当前无序区划分为左、右两个较小的子区间R[low..pivotpos-1)和R[pivotpos+1..high],并使左边子区间中所有记录的关键字均小于等于基准记录(不妨记为pivot)的关键字pivot.key,右边的子区间中所有记录的关键字均大于等于pivot.key,而基准记录pivot则位于正确的位置(pivotpos)上,它无须参加后续的排序。
  注意:
    划分的关键是要求出基准记录所在的位置pivotpos。划分的结果可以简单地表示为(注意pivot=R[pivotpos]):
    R[low..pivotpos-1].keys≤R[pivotpos].key≤R[pivotpos+1..high].keys
                  其中low≤pivotpos≤high。
②求解:
   通过递归调用快速排序对左、右子区间R[low..pivotpos-1]和R[pivotpos+1..high]快速排序。

完整的代码如下:
#include<stdio.h> 
#include<stdlib.h> 
//调用顺序:quicksort-->qsort-->partitions  
int partitions(int a[],int low,int high) 

    int pivotkey=a[low];   //基准 
    //a[0]=a[low];  
    while(low<high) 
    { 
        while(low<high && a[high]>=pivotkey) 
            --high; 
        a[low]=a[high]; 
        while(low<high && a[low]<=pivotkey) 
            ++low; 
        a[high]=a[low];  
    } 
    //a[low]=a[0];  
    a[low]=pivotkey; 
    return low; 

void qsort(int a[],int low,int high) 

    int pivotkey; 
    if(low<high) 
    { 
        //递归调用 
        pivotkey=partitions(a,low,high); 
        qsort(a,low,pivotkey-1); 
        qsort(a,pivotkey+1,high); 
    } 

 
void quicksort(int a[],int n) 

    qsort(a,0,n); 

 
//简单示例 
int main(void) 

    int i,a[11]={20,11,12,5,6,13,8,9,14,7,10}; 
    printf("排序前的数据为:\n"); 
    for(i=0;i<11;i++) 
        printf("%d ",a[i]); 
    printf("\n"); 
    quicksort(a,10); 
    printf("排序后的数据为:\n"); 
    for(i=0;i<11;i++) 
        printf("%d ",a[i]); 
    printf("\n"); 
    system("pause"); 
    return 0; 

【上篇】
【下篇】

给我留言

留言无头像?