快速排序(詳解)


描述:

通過一趟排序將要排序的數據分割成獨立的兩部分,其中一部分的所有數據都比另外一部分的所有數據都要小,然后再按此方法對這兩部分數據分別進行快速排序,整個排序過程可以遞歸進行,以此達到整個數據變成有序序列

快速排序 的平均時間復雜度為O(NlogN),是冒泡排序的一種改進版。

方法:快速排序主要采用“二分”的思想,步驟如下:

1)  設置兩個變量i、j,排序開始的時候:i=0,j=n-1;
2)第一個數組值作為比較值,首先保存到temp中,即temp=A[0];
3)然后j-- ,向前搜索,找到小於temp后,因為s[i]的值保存在temp中,所以直接賦值,s[i]=s[j]
4)然后i++,向后搜索,找到大於temp后,因為s[j]的值保存在第2步的s[i]中,所以直接賦值,s[j]=s[i],然后j--,避免死循環
5)重復第3、4步,直到i=j,最后將temp值返回s[i]中
6)  然后采用“二分”的思想,以i為分界線,拆分成兩個數組 s[0,i-1]、s[i+1,n-1]又開始排序

如下圖,以數組 6 4 7 1 2為例:

代碼如下:

#include "stdio.h"
void find_frst(int *s,int left,int right)
{
    int i=left,j=right,temp;  //(1)初始化i、j    
    if(left>=right) 
     return ;
    temp=s[i];                //(2)以第一個數組為比較值,保存到temp中 
    while(i<j)
    {    
      while(j>i&&s[j]>=temp)  //(3)j--,找小值 
      j--;
      s[i]= s[j];             //保存小值,到s[i]上 
       
      while(i<j&&s[i]<=temp)  //(4)i++,找大值 
      i++;
      s[j--]=s[i];            //保存大值 到s[j]上 
    }
    s[i]=temp;             //(5)將比較值放在s[i]上 
        
  /*(6)拆分成兩個數組 s[0,i-1]、s[i+1,n-1]又開始排序 */
  find_frst(s,left,i-1);         //
  find_frst(s,i+1,right);        //    
}
int main()
{
    int i=0,s[100],n;
    scanf("%d",&n);        //輸入數組長度
    for(i=0;i<n;i++)
    scanf("%d",&s[i]);    
    find_frst(s,0,n-1);  
    for(i=0;i<n;i++)
    printf("%d ",s[i]);      //打印
    printf("\n");
} 

既然有了排序,那么還有可能用到查找,在有序條件下,當然用二分查找快咯,即簡單又速度快

代碼如下:

#include "stdio.h"

/*快速排序  */
void find_frst(int *s,int left,int right)
{
    int i=left,j=right,temp;  //(1)初始化i、j    
    if(left>=right) 
     return ;
    temp=s[i];                //(2)以第一個數組為比較值,保存到temp中 
    while(i<j)
    {    
      while(j>i&&s[j]>=temp)  //(3)j--,找小值 
      j--;
      s[i]= s[j];             //保存小值,到s[i]上 
       
      while(i<j&&s[i]<=temp)  //(4)i++,找大值 
      i++;
      s[j--]=s[i];            //保存大值 到s[j]上 
    }
    s[i]=temp;             //(5)將比較值放在s[i]上 
        
  /*(6)拆分成兩個數組 s[0,i-1]、s[i+1,n-1]又開始排序 */
  find_frst(s,left,i-1);         //
  find_frst(s,i+1,right);        //
}


/*二分查找 
 *s[]:數組        size:數組個數   cmp:需要比較的數字     
 *返回值:表示數組的第幾個,返回-1表示沒有找到 
 */
int binary_query(const int* s, int size, int cmp)  
{  
    int low = 0;  
    int high = size-1;
    int mid;              //中間值 
    while(low<=high)  
    {  
        mid = (low+high)/2;  
        if(s[mid] == cmp)  
            return mid;  
        else if(s[mid] > cmp)  
            high = mid-1;  
        else  
            low = mid+1;  
    }  
    return -1;  
}  
int main() { int i=0,s[100],n,tmp,index; scanf("%d",&n); //輸入:數組長度 for(i=0;i<n;i++) scanf("%d",&s[i]); //輸入:數組數據 find_frst(s,0,n-1); printf("find_frst:\n",s[i]); for(i=0;i<n;i++) printf("%d ",s[i]); //打印:有序數組 printf("\n"); scanf("%d",&tmp); //輸入:要查找的數據 index=binary_query(s,n,tmp); if(index<0) printf("ERR,The value is not querying\n"); else printf("index=%d\n",index); }

 

  

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM