zoukankan      html  css  js  c++  java
  • 经典算法系列一-快速排序

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

    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 }

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

  • 相关阅读:
    knowledge_maven
    problems_springboot
    problems_halo
    skills_oracle
    hive启动报错(整合spark)
    根据父ID聚合
    sql2005数据库远程备份
    waitfor的使用
    CTE+操作性语句(删除无主键的相同的多行数据)+CTE操作技巧
    SQL中的CTE,查询所有的子集(子集的子集)比游标效率高
  • 原文地址:https://www.cnblogs.com/my-life/p/3486581.html
Copyright © 2011-2022 走看看