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

写一个系列的经典算法,共同学习!

1.快速排序

基本思想:

1.先从数列中取出一个数作为基准数。

2.分区过程,将比这个数大的数全放到它的右边,小于或等于它的数全放到它的左边。

3.再对左右区间重复第二步,直到各区间只有一个数。

在网上看到一篇博客,把快速排序命名为 挖坑填数+分治法,感觉很有道理,所以等会程序就按这两部来写。

先说说挖坑填数的思想:

1.i=L;j=R; 将基数挖出形成第一个坑a[i].

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 }

这样就简单一些了,看着简洁一些。

原文地址:https://www.cnblogs.com/my-life/p/3486581.html