快速排序1--HoardSort/Sort in CLRS

来源:互联网 发布:淘宝实名制 编辑:程序博客网 时间:2024/06/05 15:13

霍尔排序

直接上代码

int Partition1(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 


详细解释

第一步:(初始化)设置两个指针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 Partition2(int *arr, int low, int high){    int sentinel = arr[high];    int i = low-1;    for(int j=low; j<=high-1; ++j)    {        if(arr[j] <= sentinel)        {            i++;            swap(arr[i], arr[j]);        }    }    swap(arr[i+1], arr[high]);     PrintArray(arr);    return i+1;}


 

原创粉丝点击