算法學習~分治法~快速排序


天天都在排序。。簡直就是要給這個混亂的世界一個正確的秩序。。不過嘛。排序也有快慢之分,

冒泡排序法,,思路很簡單就是一個個上去打擂台,,這樣的時間復雜度很糟糕,,O(N^2)中O是一個常數,O(N^2)是指最大上限(估值)n(n-1)/2 = (n^2 - n)/2最高位估值仍為n^2兩種情況是一樣的。

選擇排序法,,每一趟從待排序的數據元素中選出最小(或最大)的一個元素,順序放在已排好序的數列的最前(最后),直到全部待排序的數據元素排完。選擇排序是不穩定的排序方時間復雜度為O(n),最壞情況下仍為O(n^2)。

排序比較好的還有這種logn級別的排序法,

先上代碼,,個位可以先瞅瞅,。一般第一次不會很明白。。下面有解釋。。

 1 //快速排序
 2 #include<stdio.h>
 3 int main()
 4 {   void quick_sort(int s[], int l, int r);
 5     int a[10001],i,x;
 6    while(~scanf("%d",&x))
 7    {  for(i=0;i<x;i++)
 8         scanf("%d",&a[i]);
 9      quick_sort(a,0,x-1);//第一個參數是數組地址,然后是需要排序的區間,i就是長度
10    for(i=0;i<x;i++)
11     {
12        printf("%d ",a[i]);//再順序輸出
13     }
14     printf("\n");
15    }
16 }
17 void quick_sort(int s[], int l, int r)//返回調整后基准數的位置
18 {
19     if (l < r)//只要是滿足起點小於終點
20     {
21         //Swap(s[l], s[(l + r) / 2]); //將中間的這個數和第一個數交換 參見注1
22         int i = l, j = r, x = s[l];//賦予初始值,i就是起點j就是終點 //s[l]就是當前的值
23         while (i<j)
24         {
25             while(i<j&&s[j]>=x) // 從右向左找第一個小於x、起點的數
26                 j--;//找到第一個小於的就會跳出循環j的值就是當前小於的那個
27             if(i<j)
28                 s[i++]=s[j];//將s[j]填到s[i]中,s[j]就形成了一個新的坑,i++
29             while(i<j&&s[i]<x) // 從左向右找第一個大於等於x的數
30                 i++;
31             if(i<j)
32                 s[j--]=s[i];//
33         }
34         s[i] = x;//退出時,i等於j。將x填到這個坑中。
35         quick_sort(s,l,i-1); //遞歸調用前半段和后半段。
36         quick_sort(s,i+1,r);
37      }
38 }

 


免責聲明!

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



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