常见的排序问题(二)

   之前利用第一篇博客写了比较经典的两种排序,接下来用这篇博客简单的一下其他几种排序方法。

  先说一下插入排序吧,插入排序的方法就是在开始的时候有一小段排列已经按照合适的大小顺序排列的数,接下来再用一个数依次和这些数从右向左进行比较,找到一个正确的位置依次把这个比较的数插入其中,依次把剩下的数都插入其中,这样就完成了一组数的排序工作。它的代码如下。

#include <stdio.h>
void insertsort (int a[], unsigned int n)
 { 
   int i=0,j=0;
   int min=0;
   for (i=0;i<n;i++)
     {
     min=a[i];
     for (j=i-1;(j>=0)&&(a[j]>min);j--;)
    a[j+1]=a[j];
    a[j+1]=min;
      }
 }
int main ()
{
int test[]={10,32,33,44,34,25,45,67,45};
unsigned int n=sizeof(test)/sizeof(int);
int i=0;
insertsort(test,n);
printf ("Afer insert sort:\n");
for (i=0;i<n;i++)
printf ("%3d",test [i++]);
return 0;

}

  这样就完成了用插入法进行排序。之前说的这三种简单排序的方法在实际的程序开发中使用也是很广泛的,它们实现方便几乎不会对系统造成损伤,也不会给系统带来安全隐患,所以吧,一般的排序任务都可以用这几种方法。

  接下来说一下另外一种排序方法,快速排序,快速排序算法是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另一部分的数据要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序用递归进行,以达到整个数据的排序。

从另外一个角度来说,快速排序也是对冒泡排序的一种改进,它的基本排序思想是:假设要排序的数组是a[0]………… a[n-1],首先它任意选取一个数据(通常选取第一个数据)作为关键数据,然后将所有比它小的数据都放在它的前面,所有比他大的数都放在它的后面,这个过程称为快速排序,以递归的方式排序前半部和后半部。基于快速排序的思想,接下来的代码就是用快速排序实现一组数的排序的。

#include <stdio.h>
void qsort(int a[], int n)
{
  int i=0,j=n-1,k=a[i];
  if (0<n-1)
  {
      while (i<j)
       {
         while (i<j&&a[j]>k);
            j--;
            if (i<j)
               a[i++]=a[j];
            while (i<j;&&a[i]<k);
                 i++;
            if (i<j)
                a[j--]=a[i];
       }
       a[i]=k;
       qsort(a,i-1);
       qsort (a+i+1,n-i-1);
  }
}
int main()
{
int test []={10,23,21,18,7,2,56,,28,21};       
unsigned int n=sizeof(test)/sizeof(int);
int i=0;
qsort (test n)
printf ("After quick sort:\n");
for (i=0;i<=n-1;i++)
printf ("%3d",test[i++]);
return 0;

}

  通过上述代码的参考代码注释以及算法分析可以理解其实现过程,快速排序的代码相比于其他排序的话,代码比较复杂,理解起来相对来说也更难一点,但是它也有着它用它比较好的情况,就是当数据的数量比较多的时候,用快速排序就比较快一点,快速排序的平均时间复杂度为O(nlgn),  所以在一般情况下,他比写起来比较简单的选择排序、冒泡排序、插入排序等更快。

  接下来吧,对之前写的排序的几种常见的算法做一个简单的总结:

1.  当记录规模较小时,直接插入排序较好;当直接选择移动的记录数少于直接插入时,应选直接选择排序为宜;

2. 若记录初始状态基本有序,则应选用直接插入或冒泡排序为宜;

3. 若记录数较大,则应采用时间复杂度为O(nlgn)的快速排序方式。快速排序是目前基于比较的内部排序中比较好用的方法,当待排序的关键字是随机分布时,快速排序的平均时间最短。

  从这个排序的例子中也可以看出随着知识学习的深入,在写代码的时候用的知识点越来越多,这样也会使写出来的代码更简短,也更实用。



  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值