排序算法思想和实现(代码)(一)

本文详细介绍四种经典的排序算法:直接插入排序、冒泡排序、选择排序和希尔排序。每种算法都配有详细的实现步骤及代码说明,帮助读者深入理解排序算法的工作原理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1. 直接插入排序算法

 

  1. /* --------------------------------------------------------------------------**
  2.  函数名称:  ms_insert_direct_sort
  3.  参数含义:  int data[]  (i/o)   排序数组
  4.             int n       (i)     数组中数据的个数 
  5.             int order   (i)     序列方式 (0 为递减,1 为递增)
  6.  功能简称:  直接插入排序。
  7.  功能描述:  将数组data[]中的n个数据按制定的方式进行排序。
  8.  实现描述:  在插入第i个记录的时候,前面的i-1个记录已经排好序,这时将记录的关键字
  9.             依次与前面i-1个记录的关键字进行比较,从而找出要插入的位置,然后将第
  10.             i个记录插入,插入位置以及其后的记录以此向后移动。
  11.  创建日期:  2008年12月27日。
  12. / ---------------------------------------------------------------------------*/
  13. void ms_insert_direct_sort(int data[], int n, int order)
  14. {
  15.     int i;
  16.     int j;
  17.     int k;
  18.     int key;
  19.     bool exchg;
  20.     for ( i=0; i<n; i++)
  21.     {
  22.         key = data[i];
  23.         for ( j=0; j<i; j++ )
  24.         {
  25.             exchg = false;
  26.             ms_data_order(exchg, data[j], key, order);
  27.             if ( exchg )
  28.             {
  29.                 for ( k=i; k>j; k--)
  30.                 {
  31.                     data[k] = data[k-1];
  32.                 }
  33.                 data[j] = key;
  34.                 break;
  35.             }
  36.         }
  37.     }
  38. }

 

2. 冒泡排序算法

  1. /* --------------------------------------------------------------------------**
  2.  函数名称:  ms_bubble_sort
  3.  参数含义:  int data[]  (i/o)   排序数组
  4.             int n       (i)     数组中数据的个数 
  5.             int order   (i)     序列方式 (0 为递减,1 为递增)
  6.  功能简称:  冒泡排序。
  7.  功能描述:  将数组data[]中的n个数据按制定的方式进行排序。
  8.  实现描述:  首先将第一个记录的关键字和第二个记录的关键字进行比较,若为逆序,则
  9.             交换两个记录的值,然后比较第二个记录的关键字和第三个记录的关键字,
  10.             以此类推,直至第n-1个记录和第n个记录的关键字进行过比较为止,上述
  11.             过程称作第一趟冒泡排序,其结果是关键字符合排序要求的记录被安置到第
  12.             n个记录的位置上,然后进行第二趟冒泡排序,对前n-1个记录进行同样的操
  13.             作,其结果是第第二个符合排序要求的记录被安置到第n-1个记录的位置上,
  14.             当进行完第n-1趟时,所有记录有序排列。
  15.  创建日期:  2008年12月27日。
  16. / ---------------------------------------------------------------------------*/
  17. void ms_bubble_sort(int data[], int n, int order)
  18. {
  19.     int i;
  20.     int j;
  21.     int tag;
  22.     int temp;
  23.     bool exchg = false;
  24.     for ( i=0, tag=1; tag==1 && i<n-1; i++ )
  25.     {
  26.         tag = 0;
  27.         for ( j=0 ; j<n-i-1; j++ )
  28.         {
  29.             exchg = false;
  30.             ms_data_order(exchg, data[j], data[j+1], order);
  31.             if ( exchg )
  32.             {
  33.                 temp = data[j];
  34.                 data[j] = data[j+1];
  35.                 data[j+1] = temp;
  36.                 tag = 1;
  37.             } 
  38.         }
  39.     }
  40. }

 

 

3. 选择排序算法

  1. /* --------------------------------------------------------------------------**
  2.  函数名称:  ms_select_sort
  3.  参数含义:  int data[]  (i/o)   排序数组
  4.             int n       (i)     数组中数据的个数 
  5.             int order   (i)     序列方式 (0 为递减,1 为递增)
  6.  功能简称:  简单选择排序。
  7.  功能描述:  将数组data[]中的n个数据按制定的方式进行排序。
  8.  实现描述:  通过n-i次关键字之间的比较,从n-i+1个记录中选出关键字最小(最大)的
  9.             的记录,并个第i(1<=i<=n)个记录进行交换,当i等于n时所有的记录有序
  10.             排列。
  11.  创建日期:  2008年12月27日。
  12. / ---------------------------------------------------------------------------*/
  13. void ms_select_sort(int data[], int n, int order)
  14. {
  15.     int i;
  16.     int j;
  17.     int k;
  18.     int temp;
  19.     bool exchg = false;
  20.     for ( i=0; i<n-1; i++ )
  21.     {
  22.         k = i;
  23.         for ( j=i+1; j<n; j++ )
  24.         {
  25.             exchg = false;
  26.             ms_data_order(exchg, data[k], data[j], order);
  27.             if ( exchg )
  28.             {
  29.                 k = j;
  30.             }
  31.             if ( k!=i )
  32.             {
  33.                 temp = data[i];
  34.                 data[i] = data[k];
  35.                 data[k] = temp;
  36.             }
  37.         }
  38.     }
  39. }

 

 

4. 希尔排序算法

  1. /* --------------------------------------------------------------------------**
  2.  函数名称:  ms_shell_sort
  3.  参数含义:  int data[]  (i/o)   排序数组
  4.             int n       (i)     数组中数据的个数 
  5.             int order   (i)     序列方式 (0 为递减,1 为递增)
  6.  功能简称:  希尔排序。
  7.  功能描述:  将数组data[]中的n个数据按制定的方式进行排序。
  8.  实现描述:  先将整个待排记录序列分割成若干序列,然后分别进行直接插入排序,待整个
  9.             序列中的记录基本有序时,再对全体记录进行一次直接插入排序。
  10.  创建日期:  2008年12月27日。
  11. / ---------------------------------------------------------------------------*/
  12. void ms_shell_sort(int data[], int n, int order)
  13. {
  14.     int i;
  15.     int j;
  16.     int k;
  17.     int m;
  18.     int key;
  19.     bool exchg;
  20.     
  21.     k = n;
  22.     int *delta;
  23.     int dk;
  24.     int cdk;
  25.     delta = (int*)malloc(sizeof(int) * (n/2));
  26.     memset(delta,0,sizeof(int) * (n/2));
  27.     i = 0;
  28.     do
  29.     {
  30.         k = k / 2;
  31.         delta[i++] = k;
  32.     }while(k>0);
  33.     cdk = i - 1;
  34.     for ( m=0; m<cdk; m++ )
  35.     {
  36.         dk = delta[m];
  37.         for ( i=0; i<n; )
  38.         {
  39.             key = data[i];
  40.             for ( j=0; j<i; )
  41.             {
  42.                 exchg = false;
  43.                 ms_data_order(exchg, data[j], key, order);
  44.                 if ( exchg )
  45.                 {
  46.                     for ( k=i; k>j; )
  47.                     {
  48.                         if ( k-dk >= 0)
  49.                         {
  50.                             data[k] = data[k-dk];
  51.                         }
  52.                         
  53.                         k = k - dk;
  54.                     }
  55.                     data[j] = key;
  56.                     break;
  57.                 }
  58.                 j = j + dk;
  59.             }
  60.             i = i + dk;
  61.         }
  62.     }
  63.     free(delta);
  64. }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值