經典算法系列一-快速排序

寫一個系列的經典算法,共同窗習!算法

1.快速排序學習

基本思想:ui

1.先從數列中取出一個數做爲基準數。spa

2.分區過程,將比這個數大的數全放到它的右邊,小於或等於它的數全放到它的左邊。code

3.再對左右區間重複第二步,直到各區間只有一個數。blog

 

在網上看到一篇博客,把快速排序命名爲 挖坑填數+分治法,感受頗有道理,因此等會程序就按這兩部來寫。排序

先說說挖坑填數的思想:博客

1.i=L;j=R; 將基數挖出造成第一個坑a[i].class

2.j--由後向前找出比它的小的數,找到後挖出此數填前一個坑a[i].程序

3.i++由前向後找出比它大的數,找到後挖出此數填前一個坑a[j].

4.重複2,3步驟直到i==j,將基數填入a[i]中。

代碼實現:

(挖坑)

 1 int Adjust(int a[],int i,int j)
 2 {
 3     int x = a[i];
 4     while(i<j)
 5     {
 6         while(i<j && x <= a[j])
 7         j--;
 8         if(i<j)
 9         {
10                a[i] = a[j];
11                i++;
12         }          
13         while(i<j && x >= a[i])
14         i++;
15         if(i<j)
16         {
17                a[j] = a[i];
18                j--;       
19         }    
20     }
21     a[i] = x;
22     return i;
23 }


分治:

 1 int quick_sort(int a[],int l,int r)
 2 {
 3     int i;
 4     if(l < r)
 5     {
 6         i = Adjust(a,l,r);
 7         quick_sort(a,l,i-1);
 8         quick_sort(a,i+1,r);
 9     }

10 }

這樣分兩步就把快速排序解決了,挺簡單的。固然這樣寫有點麻煩,能夠簡單一些:

 1 int quick(int a[],int l,int r)
 2 {
 3     int i = l;
 4     int j = r;
 5     if(l < r)
 6     {
 7         int x = a[i];
 8         while(i<j)
 9         {
10             while(i<j && x <= a[j])
11             j--;
12             if(i<j)
13             {
14                    a[i] = a[j];
15                    i++;
16             }          
17             while(i<j && x >= a[i])
18             i++;
19             if(i<j)
20             {
21                    a[j] = a[i];
22                    j--;       
23             }    
24         }
25         a[i] = x;
26         quick(a,l,i-1);
27         quick(a,i+1,r);
28     }
29 }

這樣就簡單一些了,看着簡潔一些。

相關文章
相關標籤/搜索