zoukankan      html  css  js  c++  java
  • C语言实例解析精粹学习笔记——42(插入排序)

    实例说明:

      将一个整数数组按从小到大的顺序进行排序。(主要学习基本的插入排序和改进的冒泡排序的算法和应用)

    思路1:

      从第一个数据开始,分别比较其后的数据,若比它小,则将这两个数的位置交换;从第一个数据开始,直到最后。

     1 #include <stdio.h>
     2 #include <stdlib.h>
     3 #define MAX 100
     4 
     5 
     6 
     7 int main()
     8 {
     9     int TotNumEle;
    10     int R[MAX];
    11     int temp;
    12 
    13     printf("Please input the number you will input:");
    14     scanf("%d", &TotNumEle);
    15 
    16 
    17     if(TotNumEle > MAX)
    18     {
    19         printf("Sorry, there are too many elements");
    20         return 0;
    21     }
    22 
    23     printf("Please input the elements one by one:");
    24     printf("
    ");
    25     for(int i=0; i < TotNumEle; i++)
    26     {
    27         scanf("%d", &R[i]);
    28     }
    29 
    30     for(int i=0; i<TotNumEle-1; i++)
    31     {
    32         for(int j=i+1; j<TotNumEle; j++) //要注意起始标号,刚开始的时候我就搞错了
    33         {
    34             if(R[i] > R[j])
    35             {
    36                 temp = R[i];
    37                 R[i] = R[j];
    38                 R[j] = temp;
    39             }
    40         }
    41     }
    42 
    43     printf("The sequence after sort is :
    ");
    44     for(int i=0; i<TotNumEle; i++)
    45     {
    46         printf("%4d", R[i]);
    47     }
    48 
    49     printf("
    ");
    50     return 0;
    51 }

    下面是原书中给出的示例:

      采用直接插入排序

        1. 基本思路:假设待排序的记录存放在数组R[1..n]中(R[0]不存储待排序的原始数据)。初始时,R[1]自成一个有序区,无须区为R[2..n]。从i=2起直至i=n为止,依次将R[i]插入当前的有序区R[i..i-1]中,生成含n个记录的有序区。

        插入排序与打扑克时整理手上的纸牌类似,第一张牌不需要整理,之后的逐张排序。

     1 int R[MAX];
     2 
     3 void Insert_Sort(int n)
     4 {
     5     int i,j;
     6     for(i=2; i<=n; i++)
     7     {
     8         if(R[i] < R[i-1])
     9         {
    10             R[0] = R[i]; j = i-1; //R[0]有点temp的感觉
    11             do{
    12                 R[j+1] = R[j];
    13                 j--;
    14             }while(R[0] < R[j]);
    15             R[j+1] = R[0];
    16         }
    17     }
    18 }

    以上为关键代码

    归纳注释(原书内容):

      哨兵的作用:算法中引进的附加记录R[0]称监视哨或哨兵(Sentinel)。哨兵有两个作用:

        1)进行查找(插入位置)循环之前,它保存了R[i]的副本,使不致于因记录后移而丢失R[i]的内容;

        2)它的主要作用是在循环中“监视”下标变量j是否越界。一旦越界(即j=0),因为R[0]和自己比较,循环判定条件不成立使得查找循环结束,从而避免了在该循环内的每一次均要检测j是否越界。

  • 相关阅读:
    [redis读书笔记] 第二部分 sentinel
    [redis读书笔记] 第三部分 多机数据库的实现 复制
    单线程的REDIS为什么这么快?
    [redis读书笔记] 第二部分 单机数据库 RDB持久化
    [redis读书笔记] 第二部分 单机数据库 数据库实现
    选靓号——拼多多笔试题(贪心+暴力)
    种树——拼多多笔试题(暴搜+剪枝)
    【学习笔记】《Java编程思想》 第8~11章
    leetcode——二分
    CodeForces-1265E(期望)
  • 原文地址:https://www.cnblogs.com/llccbb1/p/10669000.html
Copyright © 2011-2022 走看看