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

分析來自原文
此處爲自我理解

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;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章