排序算法研究

来源:互联网 发布:菜刀选取 知乎 编辑:程序博客网 时间:2024/05/18 02:15

排序算法有很多种,根据其思想不同,其算法也不相同。接下来我们研究一下几种常见的排序算法。

 

1.       选择排序法

选择排序就是从未排序的数据中选出最小的一个元素,放到数列的最前(或者最后)。排好后,除去第一个元素,对后面的数据再进行选择排序,依次类推。

程序的实现如下:

#include <stdio.h>

#pragma hdrstop

#include <tchar.h>

#pragma argsused

int _tmain(int argc, _TCHAR* argv[])

{

       int i,j,a[10];

       int k,m;

       printf("Please input 10 digitals:\n");

       for(i=0;i<10;i++)

       {

              scanf("%d",&a[i]);

       }

       for(i=0;i<9;i++)

       {

              k=i;

              for(j=i+1;j<10;j++)

              {

                     if(a[k]>a[j])

                     k=j;

              }

              if(k!=i)

              {

                     m=a[i];

                     a[i]=a[k];

                     a[k]=m;

              }

       }

       printf("the sorted digitals :\n");

       for(i=0;i<10;i++)

       {

              printf("%d ",a[i]);

       }

       return 0;

}

2.      冒泡排序法:

冒泡排序法就是根据气泡的上浮下沉来进行数字的排序的。思路是将相邻的两个数进行比较,小的放前面,大的放后面。先比较第一个数和第二个数,小数放前大数放后,然后比较第二个数和第三个数,小数放前,大数放后…依次类推,直到最后两个数进行比较,然后再次重复上述步骤,直到排序完成。

程序算法实现如下:

int _tmain(int argc, _TCHAR* argv[])

{

       int i,j,a[10];

       int k;

       printf("Please input 10 digitals:\n");

       for(i=0;i<10;i++)

       {

              scanf("%d",&a[i]);

       }

       for(i=0;i<9;i++)

       {

              for(j=0;j<9-i;j++)

              {

                     if(a[j]>a[j+1])

                     {

                            k=a[j];

                            a[j]=a[j+1];

                            a[j+1]=k;

                     }

              }

       }

       printf("the sorted digitals :\n");

       for(i=0;i<10;i++)

       {

              printf("%d ",a[i]);

       }

       return 0;

}

3.       插入排序法

插入排序的基本操作就是将一个数据插入到已经排好序的有序数据中,从而得到一个新的个数加1的有序数据。该算法适用于少量数据的排序。

实现步骤如下:

(1)       从第一个元素开始,该元素可以认为是已经排好序的。

(2)       取出下一个元素,在已排好序的元素数列中从后向前扫描。

(3)       如果该元素(已排好序)大于新元素,该元素移动到下一位。

(4)       重复步骤(3)直到找到已排好序的元素小于或等于新元素的位置。

程序算法实现如下:

int _tmain(int argc, _TCHAR* argv[])

{

       int i,j,a[10];

       int k;

       printf("Please input 10 digitals:\n");

       for(i=0;i<10;i++)

       {

              scanf("%d",&a[i]);

       }

       for(i=1;i<10;i++)

       {

              k=a[i];

              j=i-1;

              while((k<a[j])&&(j>=0))

              {

                     a[j+1]=a[j];

                     j--;

              }

              a[j+1]=k;

       }

       printf("the sorted digitals :\n");

       for(i=0;i<10;i++)

       {

              printf("%d ",a[i]);

       }

       return 0;

}

 

4.       希尔排序法

希尔排序是插入排序的一种,是针对直接插入排序算法的改进,该方法也称为缩小增量排序,因D.L.shell于1959年提出而得名。

首先取一个小于n的整数d1作为第一个增量,把数据的全部元素分为d1个组,同一组中元素的个数是d1的倍数,先在各组内进行直接插入排序,然后取出第二个增量d2<d1,重复上述的分组和排序,直至所取的增量dt=1(dt<dt-1<…<d2<d1),即所有元素放在同一组中进行插入排序为止。

程序算法实现如下:

#include <stdio.h>

#pragma hdrstop

#include <tchar.h>

#pragma argsused

int _tmain(int argc, _TCHAR* argv[])

{

       int i,j,a[10];

       int t,k=10;

       printf("Please input 10 digitals:\n");

       for(i=0;i<10;i++)

       {

              scanf("%d",&a[i]);

       }

       while(k>0)

       {

              for(i=k;i<10;i++)

              {

                     j=i-k;

                     while(j>=0)

                     {

                            if(a[j]>a[j+k])

                            {

                                   t=a[j];

                                   a[j]=a[j+k];

                                   a[j+k]=t;

                            }

                            else

                            break;

                     }

              }

              k/=2;

       }

       printf("the sorted digitals :\n");

       for(i=0;i<10;i++)

       {

              printf("%d ",a[i]);

       }

       return 0;

}

希尔排序是基于插入排序的一种算法,增加了一个新的特性,提高了效率,但不太稳定。对于中等大小规模数据量的排序表现良好。由于希尔排序在最坏的情况下和在平均的情况下执行效率差不多,而快速排序在最坏的情况下执行的效率非常差,所以建议在任何排序工作开始时都可以用希尔排序法进行排序,如果不够快,再改成快速排序等更高级的排序算法。

 

5.       快速排序法

快速排序法是对冒泡排序的一种改进,由C.A.R.Home在1962年提出。其基本思想是通过一趟排序将要排序的数据分割成两个独立的部分,其中一部分的所有数据比另外一部分的所有数据都要小,然后再按此方法对着两部分数据分别进行快速排序。整个排序过程可以通过递归实现,已达到整个数据变成有序数列。

程序算法实现如下:

#include <stdio.h>

#pragma hdrstop

#include <tchar.h>

#pragma argsused

int p(int a[],int low,int high)

{

       int key=a[low],p;

       while(low<high)

       {

              while(low<high&&a[high]>=key)

              --high;

              p=a[low];a[low]=a[high];a[high]=p;

              while(low<high&&a[low]<=key)

              ++low;

              p=a[high];a[high]=a[low];a[low]=p;

       }

       a[low]=key;

       return low;

}

 

void q(int a[],int low,int high)

{

       int j;

       if(low<high)

       {

              j=p(a,low,high);

              q(a,low,j-1);

              q(a,j+1,high);

       }

}

 

int _tmain(int argc, _TCHAR* argv[])

{

       int i,a[10];

       printf("Please input 10 digitals:\n");

       for(i=0;i<10;i++)

       {

              scanf("%d",&a[i]);

       }

    q(a,0,9);

       printf("the sorted digitals :\n");

       for(i=0;i<10;i++)

       {

              printf("%d ",a[i]);

       }

       return 0;

}