2.1插入排序

一、概述

 

1、适用场景:对少量元素进行排序,当元素数量较多时,插入排序的效率低

2、算法过程的描述:现有n个无序的数,依次将第1,2,3……n个数插入到有序数列中,如下图所示:

 

 

二、算法导论代码

1、伪代码

 

注:伪代码中,数组下标从1开始,C++具体代码中,数组下标从0开始

 

 

2、伪代码的实现

#include <iostream>
using namespace std;

bool insertion_sort(int array[], int array_length) {  //按照从小到大排序
    int key, i;
    
    for (int j = 1; j < array_length; ++j) {  //j表示第j个将要插入到有序数列的数
        key = array[j];                       //使用key记录第j个数
        
        i = j - 1;                             //使用i记录第j个数的前一个数的位置
        while (i >= 0 && array[i] > key) {    //只有 aj < a'j-1,才执行while循环(前j-1个数是有序的, a'0 ≤ a'1 …… ≤a'j-1)
            array[i + 1] = array[i];          //将a'0,a'1,a'2,…… a'j-1中大于aj的数向右移动一个位置
            i = i - 1;                        //将i指向前一个数
        }
        array[i + 1] = key;                   //如果执行了while循环,i+1表示第j个数将要插入的位置,将第j个数插入到有序数列中
    }

    return true;
}

int main() {

    int array[10] = { 5,2,1,8,7,9,3,4,6,0 };  //初始化整型数组

    insertion_sort(array, 10);                //函数调用

    for (int index = 0; index < 10; index++)  //遍历数组
        std::cout << array[index] << endl;

    return true;
}

 

 

三、看伪代码前自己写的插入排序

 

#include <iostream>
using namespace std;

bool insertion_sort(int array[], int array_length) {  //和上述代码做比较,列出不足之处
    for (int j = 1; j < array_length; ++j) {

        for (int i = j - 1; i >= 0; --i) {           //当第j个数大于第j-1个数时,应该跳出循环,不应该继续循环,去比较第j个数和第j-2、j-3、……、0个数的值
            if (array[i + 1] < array[i]) {           //不跳出循环,增加了循环次数和比较次数
                int temp = array[i + 1];             //每次满足比较条件后,都会进行数据交换,增加了交换次数
                array[i + 1] = array[i];
                array[i] = temp;
            }
        }

    }

    return true;
}

int main() {

    int array[10] = { 5,2,1,8,7,9,3,4,6,0 };       

    insertion_sort(array, 10);                 

    for (int index = 0; index < 10; index++)       
        std::cout << array[index] << endl;

    return true;
}

 

posted @ 2022-07-22 15:24  阿斯顿之意  阅读(130)  评论(0)    收藏  举报