当前位置:嗨网首页>书籍在线阅读

24-伪代码详解

  
选择背景色: 黄橙 洋红 淡粉 水蓝 草绿 白色 选择字体: 宋体 黑体 微软雅黑 楷体 选择字体大小: 恢复默认

3.4.4 伪代码详解

(1)划分函数

我们编写划分函数对原序列进行分解,分解为两个子序列,以基准元素pivot为界,左侧子序列都比pivot小,右侧子序列都比pivot大。先从右向左扫描,找小于等于pivot的数,找到后两者交换(r[i]和r[j]交换后i++);再从左向右扫描,找比基准元素大的数,找到后两者交换(r[i]和r[j]交换后j−−)。扫描交替进行,直到i=j停止,返回划分的中间位置i。

int Partition(int r[],int low,int high)   //划分函数
{
     int i=low,j=high,pivot=r[low];       //基准元素
     while(i<j) 
     {
         while(i<j&&r[j]>pivot) 
             j--;                         //向左扫描
         if(i<j) 
         {
             swap(r[i++],r[j]);           //r[i]和r[j]交换后i右移一位
         }
         while(i<j&&r[i]<=pivot) 
             i++;                         //向右扫描
         if(i<j) 
         {
              swap(r[i],r[j--]);          //r[i]和r[j]交换后j左移一位
         }
     }
     return i;                            //返回最终划分完成后基准元素所在的位置
}

(2)快速排序递归算法

首先对原序列执行划分,得到划分的中间位置mid,然后以中间位置为界,分别对左半部分(low,mid−1)执行快速排序,右半部分(mid+1,high)执行快速排序。递归结束的条件是lowhigh。

void QuickSort(int R[],int low,int high){ 
     int mid; 
     if(low<high) 
     {
          mid=Partition(R,low,high);      //返回基准元素位置
          QuickSort(R,low,mid-1);         //左区间递归快速排序
          QuickSort(R,mid+1,high);        //右区间递归快速排序
     }
}