快速排序—>挖坑填数+分治法

分析来自原文
此处为自我理解

1. 挖坑填数

i =Left; j = Right; 将基准数X挖出形成第一个坑a[i]。
while(i!=j)//直到i等于j
{
2.j–由后向前找比它(x)小的数,找到后挖出此数填前一个坑a[i]中。//多一个坑后面填
3.i++由前向后找比它(x)大的数,找到后也挖出此数填到前一个坑a[j]中。
}

将基准数X填入a[i]中
返回此时的i        //或者j,i==j

int adjustarray(int s[],int left,int right)
{
   int i=left,j=right,x=s[1];//存第一位的值。so begin from right
   while(i<j)
   {//left exchange
      while(i<j&&s[j]>x)
      j--;// 
      if(i<j)
      {
         s[i]=s[j];
         i++;
      }
      //right exchange 
      while(i<j&&s[i]<x)
      i++;
      if(i<j)
      {
          s[j]=s[i];
          j--;
      } 
      s[i]=x;
      
   }



}

2.分治法

  1. 先将数组进行一次排序(利用上个函数)
  2. 递归调用 (注意left与right的值的变化)左右分开。
void quick_sort(int s[],int left,int right)
{ 
    if(left<right)
    {
      int i=adjustarray(s,left, right);
      quick_sort( s,left,i-1);
      quick_sort( s,i+1,right);
    }

}

1+2=3.整合

void quick_sort(int s[],int left,int right)//right为下标
{
    int i=left,j=right,x=s[i];
    if(i<j)
    {
      while(i<j)
      {
        while(i<j&&s[j]>x)
           j--;
        if(i<j)
           s[i]=s[j];
        while(i<j&&s[i]<x)
            i++;
        if(i<j)
           s[j]=s[i];
       }     //此处可不用,循环到前面可+1
    }
    s[i]=x;
    quick_sort(s,left,i-1);
    quick_sort(s,i+1,right);
}

//可能有点问题???
//选择基准可以跟简洁!三值选中

//别人的代码,

int Partition(int A[], int left, int right){
    int p = round(1.0*rand()/RAND_MAX*(right - left) + left);
    swap(A[p], A[left]);
 
    int temp = A[left];
    while(left < right> temp) right--;
        A[left] = A[right];
        while(left &lt; right && A[left] &lt;= temp) left++;
        A[right] = A[left];
    }
    A[left] = temp;
    return left;
}
 
void quickSort(int A[], int left , int right){
    if (left &lt; right){
        int pos = Partition(A, left, right);
        quickSort(A, left, pos -1);
        quickSort(A, pos + 1, right);
    }
}
 
int main(){
    int A[5] ={2, 4, 1, 3, 5};
    quickSort(A, 0, 4);
    for (int i = 0; i &lt; 5; ++i) {
        if(i) printf(" ");
        printf("%d", A[i]);
    }
    return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章