• 算法导论学习笔记(一):插入排序


    插入排序:

    插入排序的大概步骤是从第二个元素开始遍历,当遍历到第N个元素时,前面N - 1个元素都已经排好序了,然后查找

    前面排好序的N - 1个元素,将第N个元素插入到适当的位置。也就是说插入排序实现有两个关键点:如何保证遍历到

    当前元素时,前面的元素是已经排好序的、怎么将元素插入到适当的位置。下面就以将元素升序排序来说明。

       

    首先,先来解决第一个问题,即保证遍历到当前元素时,前面的元素已经是按升序排好了。为了说明的方便,就用N

    来表示当前遍历的元素在数组中的位置。当 N = 2时,前面只有一个元素,毫无疑问一个元素肯定是排好序了的。当

    N=3时,我们要在前面两个元素中查找,并将其插入合适的位置,那么这就涉及到第二个问题啦。因为这里我们是以

    按升序排序为例的,所以我们就从N - 1个元素开始向前查找,直到找到比第一个比第N个元素小的元素,设这个元素

    在数组中的位置为i,如果遍历完了前面的元素都没有找到,那么设i 0。那么这时将第N个元素插入i + 1的位置。我

    们继续回到 N = 3的情况,先确定此时前两个数已经是升序的了。我们假设前三个数开始分别为512N 2时,

    往前遍历没有比它小的数,这时得出的i 0,所以我们将1插入第一个位置,现在的顺序为152N3时,前2

    数显然已经是排好序的了,那么这时我们找到12小,i = 1,所以将2插入第二个位置,数组顺序变为125。当我

    们继续遍历N = 4时,前三个数已经排好序了。以此类推下去,遍历到任意第N个元素时,前N - 1个元素都是已经排好

    序了。当遍历完最后一个元素后,数组也已经按我们想要的顺序排好了。

    实现代码如下:

    • #include <stdio.h>
    • #include <stdlib.h>  
    •   
    • void print_array (int a[], int size);  
    • void insert_sort (int a[], int size);  
    •   
    • int main()  
    • {  
    •     int size, i;  
    •     int *a;
    •     printf("input size of array:size = ");
    •     scanf("%d",&size);
    •     a = (int *)malloc(size * sizeof(int));
    •     
    •     for (int i = 0; i < n; i++)  
    •     {
    •         printf("input a[%d] = ",i);
    •         scanf("%d",&a[i]);  
    •     }
    •     
    •     print_array(a,size);    
    •     insert_sort (a, size);  
    •       
    •     return 0;  
    • }  
    •   
    • void insert_sort (int a[], int size)  
    • {  
    •     int i,j; 
    •     int key;  
    •     for (i = 1; i < size; i++)  
    •     {  
    •         key = a[i];  
    •         j = i - 1;  
    •         while ((j > -1) && (key < a[j]))  //查找前N-1个元素  
    •         {  
    •             a[j + 1] = a[j];  
    •             j--;  
    •         }  
    •         a[j + 1] = key;  
    •         print_array (a, size);  //用于输出每次遍历后数组的情况,以便观察  
    •     }  
    • }  
    •   
    • void print_array (int a[], int size)  //输出当前数组所有元素  
    • {  
    •      int i;
    •     for (i = 0; i < n; i++)
    •     {
    •         printf(" %d  ",a[i]);
    •     }
    •     printf(" ");

    这里数组的下标是以0开始的,运行结果如下:

    从运行结果可以看出,插入排序在有时候会有多余的遍历,而且数组原来已排序的程度越高,多余的遍历也越多。所

    以在选择排序算法时应该结合实际环境来选择最合适的排序算法

       

    来自 <http://note.youdao.com/share/?id=921c10319ebc53c3f2e2a9410278a852&type=note>

       

  • 相关阅读:
    Code Forces Gym 100886J Sockets(二分)
    CSU 1092 Barricade
    CodeChef Mahesh and his lost array
    CodeChef Gcd Queries
    CodeChef GCD2
    CodeChef Sereja and LCM(矩阵快速幂)
    CodeChef Sereja and GCD
    CodeChef Little Elephant and Balance
    CodeChef Count Substrings
    hdu 4001 To Miss Our Children Time( sort + DP )
  • 原文地址:https://www.cnblogs.com/fuyou/p/3233274.html
Copyright © 2020-2023  润新知