算法导论2.1 插入排序

插入排序

// insertion_sort.h not with template
#include <iostream>
#include <stdint.h>
// INSERTION-SORT(A)
// for j = 2 to A.length
//     key = A[j]
//     // Insert A[j] into sorted sequence A[1..j - 1].
//     i = j - 1
//     while i > 0 and a[i] > key
//         a[i + 1] = a[i]
//         i = i - 1
//     a[i + 1] = key

// allow the same key

void insertion_sort(uint64_t* A, uint64_t const n)
{
    uint64_t key;
    int64_t i;
    // j = 2 to A.length(j 1 to n - 1)
    for (uint64_t j = 1; j < n; j++) // j begin with A[1]
    {
        key = A[j];
        i = j - 1;                   // i begin with A[0]
        while (i >= 0 && A[i] > key)
        {
            A[i + 1] = A[i];
            i--;
        }
        A[i + 1] = key;
    }
}

// insertion_sort.cpp
#include "insertion_sort.h"

#ifdef __linux
#include <stdio.h>
#endif

int main()
{
    uint64_t array[6] = { 5, 2, 4, 6, 1, 3 };
    for (uint64_t i = 0; i < sizeof(array) / sizeof(uint64_t); i++)
    {
        std::cout << array[i] << " ";
    }
    std::cout << std::endl;
    insertion_sort(array, sizeof(array) / sizeof(uint64_t));
    for (uint64_t i = 0; i < sizeof(array) / sizeof(uint64_t); i++)
    {
        std::cout << array[i] << " ";
    }
    std::cout << std::endl;
    getchar();
    return 0;
}

插入排序模版

// 插入排序 insertion_sort_t.h

#include <iostream>
#include <string>

// INSERTION-SORT(A)
// for j = 2 to A.length
//     key = A[j]
//     // Insert A[j] into sorted sequence A[1..j - 1].
//     i = j - 1
//     while i > 0 and a[i] > key
//         a[i + 1] = a[i]
//         i = i - 1
//     a[i + 1] = key

template <class Type> void insert_sort_t(Type * const a, int const & n)
{
    Type key;
    // j赋值为1因为是从第二个元素开始插入排序
    // j<n因为n代表着待排序的数组元素的个数,n-1为最后一个元素
    for (int j = 1; j < n; j++)
    {
        key = a[j];    // 等待插入的元素为a[j]
        int i = j - 1; // a[0...j-1]为已经有序的部分,a[j+1...n-1]为还没有排序的部分
        // 我们首先要比较的是a[j]与a[j-1]
        while ((i >= 0) && (a[i] > key))
        {
            a[i + 1] = a[i]; // 所有比a[j]大的元素后移一位
            i--;
        }
        a[i + 1] = key;      // 将a[j]放到正确的位置上去
    }
}

// insertion_sort_t.cpp
#include "insertion_sort_t.h"

#ifdef __linux
#include <stdio.h>
#endif

int main()
{
    int a[6] = { 5, 2, 4, 6, 1, 3 };
    insert_sort_t(a, 6);
    for (int i = 0; i < 6; i++)
    {
        std::cout << a[i] << " ";
    }
    std::cout << std::endl;
    std::string b[4] = { "hello", "China", "haha",  "I Love China"};
    insert_sort_t(b, 4);
    for (int i = 0; i < 4; i++)
    {
        std::cout << b[i] << " ";
    }
    std::cout << std::endl;
    getchar();
    return 0;
}
时间: 2025-01-21 12:00:51

算法导论2.1 插入排序的相关文章

算法导论—排序之插入排序

void insertion_sort(vector<int> &num){ for(int i = 1; i < num.size(); i++){ int j = i-1; int val = num[i]; while(j>=0 && num[j] >= val){ num[j+1] = num[j]; j--; } num[j+1] = val; } } 每次迭代时,将num[i] 作为key值,且前子数组[0,i-1] 构成已排好序,每次与左

算法导论学习之插入排序+合并排序

最近准备花时间把算法导论详细的看一遍,强化一下算法和数据结构的基础,将一些总结性的东西写到博客上去. 一.插入排序 算法思想:如果一个数组A,从A[1–n-1]都是有序的,然后我们将A[n]插入到A[1–n-1]的某个合适的位置上去那么就可以保证A[1–n]都是有序的.这就是插入排序的思想:具体实现的时候我们将数组的第一个元素看出有序,然后从第二个元素开始按照上面的步骤进行插入操作,直到插入最后一个元素,然后整个数组都是有序的了. 时间复杂度分析:代码中有两重for循环,很容易看出时间复杂度是n

算法导论学习 之 插入排序

刚刚开始系统学习算法导论和c++,每次学习的算法都用c++ 实现一边,加深理解,方便回顾. 先从最简单的插入排序开始吧: code: #include<iostream> #include<vector> #include<map> using namespace std; void Insertion_Sort(int * a,int length) { int i,j,key; for(i = 1;i < length;i ++){ key = a[i]; j

算法导论笔记1 - 插入排序 vs 归并排序

import random import time __author__ = 'Administrator' LENGTH = 3000 base = [] for i in range(0, LENGTH): base.append(random.randint(0, LENGTH)) def ins_sort(array): for border in range(1, len(array)): j = border - 1 key = array[border] while j >= 0

算法导论 第2章

本章主要是算法知识的基础讲解,介绍了循环不变式,几个简单的排序算法,递归分治算法等内容. 1.循环不变式 循环不变式主要用来说明算法的正确性,那么什么是循环不变式呢,其实就是在循环过程中,一些元素数据必须保持的一些性质,例如在插入排序中,数组为A,必须保证三个性质: (1) 初始化:在循环开始之前,循环不变式是成立的,即:A[0]是有序的,A[1...n-1]是无序的. (2) 保持:在循环的某一次迭代开始之前,循环不变式是成立的,那么在此次迭代结束后依然应该是成立的,即:A[0...i]是有序

插入排序——算法导论

最近在看MIT的算法导论,在网易公开课上有这门课的视频,正好讲义也在图书馆借到了,有在看的小伙伴可以一起加油. 绪论中以插入排序为例,讲述了算法中非常重要的两个概念时间复杂度T(n)和空间复杂度.详细地对程序花费时间T. 伪代码: INSERTION-SORT(A) 1 for j←2 to length[A] 2 do key←A[j] 3 Insert A[j] into the sorted 4 sequence A[1..j-1]. 5 i←j-1 6 while i>0 and A[i

算法导论(Introduction to Algorithms )— 第二章 算法入门 — 2.1 插入排序

一.插入排序:INSERTION-SORT 1.适用范围: which is an efficient algorithm for sorting a small number of elements. 对于少量元素的排序,插入排序是一种高效的算法. 2.原理: Insertion sort works the way many people sort a hand of playing cards. We start with an empty left hand and the cards

算法导论之插入排序和归并排序

一.创建我们的测试工程 因为我们只理解相应算法,没有什么用户图形,也就用不到UI了,在这儿使用Xcode创建一个基于Mac开发的控制台工程即可,整个工程很简单,一个main函数一个排序类,如下所示. 在Sort类中我们写了关于排序的一些类方法,然后在main函数中进行调用. 二.插入排序 插入排序顾名思义,就是把无序的元素插入到有序的元素当中.<算法导论>中举了一个特为形象的例子,插入排序就如同你在打扑克时摸牌一样,手里的牌是有序的,而你刚摸得牌是是随机的,需要你插入到已经排好序的扑克牌中,这

算法导论-排序-插入排序、归并排序

目录: 1.插入排序算法伪码 2.插入排序c++实现 3.归并排序算法伪码 4.归并排序c++实现 5.总测试程序 内容: 1.插入排序算法伪码 Insertion_sort(A[],n) //数组下标从1开始 for j <- 2 to n do key <- A[j] i <- j-1 while i>0 and A[i]>key A[i+1] <- A[i] i <- i-1 A[i+1]=key 2.插入排序c++实现 1 template<type