各种排序算法分析与总结

来源:互联网 发布:c语言洗牌程序 编辑:程序博客网 时间:2024/04/30 01:45
  1. 冒泡排序

    冒泡排序基本思想:通过一遍一遍相邻数的交换,把最大或最小的数挪到一遍,利用两个for循环进行排序

     

     

     

    #include<stdio.h>

    int main()

    {

       intn,a[100],t;

       scanf("%d",&n);

       for(inti=0;i<n;i++)

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

       for(inti=0;i<n-1;i++)

       {

                  for(intj=0;j<n-1-i;j++)

                  {

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

                            {

                                       t=a[j];

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

                                       a[j+1]=t;

                            }

                  }

       }

       for(inti=0;i<n;i++)

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

       return0;

     }

  2. 选择排序

    冒泡排序基本思想:从前往后,先找到最小(大)的数,将其储存到第一个数组里面,然后再从剩下的数里面找最小的数,储存到第二个数组里面,依次排序

#include<stdio.h>

int main()

{

           intn,a[100],min,t;

           scanf("%d",&n);

           for(inti=0;i<n;i++)

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

           for(inti=0;i<n;i++)

           {                                                             

                     for(intj=i;j<n;j++)

                     {

                                if(a[j]<a[i])

                                {

                                          t   =a[i];

                                          a[i]=a[j];

                                          a[j]=t;         

                                }

                     }

           }

           for(inti=0;i<n;i++)

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

           return0;

 }

  1. 希尔排序

基本思想:选定间隔,然后利用插入排序,把对应间隔的数字进行排序,直到间隔到1停止

 

 

#include<stdio.h>

 void xe_sort(int a[],int n);

int main()

{

           int n,a[1000];

           scanf("%d",&n);

           for(int i=0;i<n;i++)

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

           xe_sort(a,n);

           for(int i=0;i<n;i++)

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

          

           return 0;

 }

 

 

 void xe_sort(int a[],int n)

 {

         intgap,i,j;

           for(gap=n/2;gap>0;gap/=2)//选定间隔

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

                     {

                                for(j=i;j<n;j+=gap)//利用插入排序把所有间隔为gap的数据排序

                                {

                                          inttemp=a[j];

                                    int k=j;

                                          if(a[j]<a[j-gap])

                                          {        

                                                     while(k>0&&temp<a[k-gap])

                                                     {

                                                               a[k]=a[k-gap];

                                                               k-=gap;

                                                     }

                                                     a[k]=temp;

                                          }

                                }

                               

                     }

 }

 

 

  1. 快速排序

     

通过设置一个数,利用一个循环把比这个数小的数都放其左端,把比它大的数都放在其右边,然后重复这个步骤利用递归,最终实现排序。

#include<stdio.h>

 void Q_sort(int a[],int n);

int main()

{

           int n,a[1000];

           scanf("%d",&n);

           for(int i=0;i<n;i++)

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

           Q_sort(a,n);

           for(int i=0;i<n;i++)

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

          

           return 0;

 }

 void Q_sort(int a[],int n)

 {

         intkey=a[0]; //给key赋值, 对应的以下代码下key的初值为a[0]

         inti=0,j=n-1;

         if(n>1)//利用递归的出空

         {

                    while(i!=j)

                    {

                              for(;i<j;j--)

                                         if(key>a[j])

                                         {

                                                    a[i]=a[j];

                                                   break;

                                          }

                                for(;i<j;i++)

                                          if(key<a[i])

                                          {

                                                   a[j]=a[i];

                                                   break;

                                          }

                                if(i==j)    a[i]=key;//把替换了的key还原

                     }

                     Q_sort(a,i);  //往前递归

                     Q_sort(a+i+1,n-i-1);      //往后递归         

           }

 }

 

  1. 插入排序

基本思想:把一个数插入到已经有序的数列中,直到插完所有的数

 

 

#include<stdio.h>

 void sort(inta[],int n);

int main()

{

           intn,a[1000];

           scanf("%d",&n);

           for(inti=0;i<n;i++)

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

           sort(a,n);

           for(inti=0;i<n;i++)

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

          

           return0;

 }

 void sort(inta[],int n)

 {

         int key,i,j;

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

         {

                    key=a[i];//确定要插入的数

                    for(j=i;j>0&&a[j-1]>key;j--)

                    {

                              a[j]=a[j-1];//为要插入的数留出空隙

                     }

                     a[j]=key;//把相应的数插入

            }

 }

 

 

 

0 0
原创粉丝点击