代码改变世界

快速排序

2012-04-27 21:54  youxin  阅读(243)  评论(0编辑  收藏  举报

先看普通版本

#include<stdio.h>
int Partition(int A[],int p,int r)
{
    //最后一个r做pivot
    int tmp;
    int i=p-1;
    int j=p;
    for(j=p;j<=r-1;j++)
        if(A[j]<=A[r])
{ i
++; tmp=A[i];A[i]=A[j];A[j]=tmp; } tmp=A[i+1],A[i+1]=A[r],A[r]=tmp; return i+1; } void QuickSort(int A[],int p,int r) { int q; if(p<r) { q=Partition(A,p,r); QuickSort(A,p,q-1); QuickSort(A,q+1,r); } } int main() { int i,n; int arr[20]; printf("请输入数组的大小"); scanf("%d",&n); printf("请输入数组元素\n"); for(i=0;i<n;i++) scanf("%d",arr+i); QuickSort(arr,0,n-1); printf("快速排序结果为\n"); for(i=0;i<n;i++) printf("%d\t",arr[i]); }

随机化是从a[p...r]中随机选出的一个元素交换。

随机化代码是quicksort划分时q=randomized_partition;

randomized_partition(int a[],int p,int r)
{
  srand(time(NULL)); //产生不同的种子
int i=rand()%(r-p+1)+p; // [p,r]; { int tmp=a[r];a[r]=a[i];a[i]=tmp; } return partition(a,p,r); }

rand()在stdlib.h头文件中。time在头文件time.h中.

 

快速排序partition还有一个版本比较流行。

int partition2(int a[],int p,int r)
{
    int i,j;
    //a[p] pivot
    i=p+1;
    j=r;
//这里不能写成while(l<r),否则不会正确排序,比如 5,3,-1,4,7
while(1) { while(a[i]<a[p]) i++; while(a[j]>a[p]) j--; if(i>=j) break; int tmp=a[i],a[i]=a[j],a[j]=tmp; } int tmp=a[j],a[j]=a[p],a[p]=tmp; //不能写成swap(a[i],a[p]),只能是j. return j; }

为什么不能写成

wap(a[i],a[p]),只能是j.可以用2,1,3举例。
最后i变成了2,j变成1。只能是j是因为a[j]一定是小于pivot的。

更简单代码:

int Partition(int a[],int p,int r) 
     
{ 
    int i=p,j=r+1; 
    int x=a[p]; 
    while(1)
    {   
         while(a[++i]<x && i<r); 
         while(a[--j]>x); 
         if(i>=j) break; 
         int temp; //交换两个数的值 
         temp=a[j]; a[j]=a[i]; a[i]=temp; 
    }

       a[p]=a[j]; a[j]=x;
       return j; 
}