【排序】快速排序

快速排序算法QuickSort
   void QuickSort(SeqList R,int low,int high)
    { //对R[low..high]快速排序
      int pivotpos; //划分后的基准记录的位置
      if(low<high){//仅当区间长度大于1时才须排序
         pivotpos=Partition(R,low,high); //对R[low..high]做划分
         QuickSort(R,low,pivotpos-1); //对左区间递归排序
         QuickSort(R,pivotpos+1,high); //对右区间递归排序
       }
     } //QuickSort

   注意:
      为排序整个文件,只须调用QuickSort(R,1,n)即可完成对R[l..n]的排序。


划分算法Partition
① 具体做法
  第一步:(初始化)设置两个指针i和j,它们的初值分别为区间的下界和上界,即i=low,i=high;选取无序区的第一个记录R[i](即R[low])作为基准记录,并将它保存在变量pivot中;
  第二步:令j自high起向左扫描,直到找到第1个关键字小于pivot.key的记录R[j],将R[j])移至i所指的位置上,这相当于R[j]和基准R[i](即pivot)进行了交换,使关键字小于基准关键字pivot.key的记录移到了基准的左边,交换后R[j]中相当于是pivot;然后,令i指针自i+1位置开始向右扫描,直至找到第1个关键字大于pivot.key的记录R[i],将R[i]移到i所指的位置上,这相当于交换了R[i]和基准R[j],使关键字大于基准关键字的记录移到了基准的右边,交换后R[i]中又相当于存放了pivot;接着令指针j自位置j-1开始向左扫描,如此交替改变扫描方向,从两端各自往中间靠拢,直至i=j时,i便是基准pivot最终的位置,将pivot放在此位置上就完成了一次划分。
划分算法:
   int Partition(SeqList R,int i,int j)
     {//调用Partition(R,low,high)时,对R[low..high]做划分,
      //并返回基准记录的位置
       ReceType pivot=R[i]; //用区间的第1个记录作为基准 '
       while(i<j){ //从区间两端交替向中间扫描,直至i=j为止
         while(i<j&&R[j].key>=pivot.key) //pivot相当于在位置i上
           j--; //从右向左扫描,查找第1个关键字小于pivot.key的记录R[j]
         if(i<j) //表示找到的R[j]的关键字<pivot.key
             R[i++]=R[j]; //相当于交换R[i]和R[j],交换后i指针加1
         while(i<j&&R[i].key<=pivot.key) //pivot相当于在位置j上
             i++; //从左向右扫描,查找第1个关键字大于pivot.key的记录R[i]
         if(i<j) //表示找到了R[i],使R[i].key>pivot.key
             R[j--]=R[i]; //相当于交换R[i]和R[j],交换后j指针减1
        } //endwhile
       R[i]=pivot; //基准记录已被最后定位
       return i;
     } //partition



实例:

#include <stdio.h>

int part(int a[],int i,int j)
{
        int pos=a[i];
        while(i<j){
                while(i<j&&a[j]>=pos) j--;
                if(i<j) a[i++]=a[j];
                while(i<j&&a[i]<=pos) i++;
                if(i<j) a[j--]=a[i];
        }
        a[i]=pos;
        return i;
}
void quicksort(int a[], int low, int high)
{
        int pos;
        if(low<high){
                pos=part(a,low,high);
                quicksort(a,low,pos-1);
                quicksort(a,pos+1,high);
        }
}

int main()
{
        int a[10]={29,48,7,16,325,4,3,22,112,40};
        int i;
        quicksort(a,0,9);

        printf("the out put is\n");
        for(i=0;i<10;i++)
        printf("%d\n",a[i]);
        return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值