算法导论之——插入排序

#include<stdio.h>
/*我们希望排序的数也称为关键字*/
void sort_on(void);
void sort_down(void);
int A[6] = { 5,2,4,6,1,3 };
int main(void)
{
    //sort_down();
    sort_on();
    for (int num = 0; num<6; num++)
        printf("%d ", A[num]);
    return 0;
}
//升序
void sort_on(void)
{
    int key ;
    int i ;
    for (int j = 1; j<6; j++)
    {
         key = A[j];//得到我们需要排序的数,即关键字,这句有保存作用
         i = j - 1;//记录当前要排序的数的前一个位置
        while (i >= 0 && A[i]>key)//如果当前数大于要排序的数,则把大的数后移一个位置
        {
            A[i + 1] = A[i];
            i--;
        }
        A[i + 1] = key;//把保存的key移到指定位置
    }
}
//降序
void sort_down(void)
{
    int key ;
    int i ;
    for (int j = 1; j<6; j++)
    {
         key = A[j];
         i = j - 1;
        while (i >= 0 && A[i]<key)
        {
            A[i + 1] = A[i];
            i--;
        }
        A[i + 1] = key;
    }
}

算法思路(已升序为例):

key=A[j];保存需要的比较值,while循环中,A[i]>key,当前key值的前一个值如果大于key值,就把A[i]的值后移一位,此时后移的位覆盖了key,然后i--,又循环重复,一直到循环结束,循环结束时,从小到大排列,但是此时由于之前i--的原因,跳出循环之后,要把第一步保存的key值给A[i+1];必须要是i+1。这样,保证了要排序的值在本次排序之后是从左到右依次变大的。

文字的分析还是不够直接,需要自己推导过程去理解。

在这之后,我们应该要知道这个数学交换比较过程怎么用算法去实现。

在设计模式上存在缺陷,其实应该写成移植性更高的代码,试想要是我现在要排序100个元素的数组时,这个代码需要更改很多地方,但这次作为练手,就先这样了。以后注意改进。O(∩_∩)O

时间: 2024-10-27 07:21:47

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

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

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

【算法导论】插入排序

排序问题 输入:n个数的一个序列<a1, a2, ..., an> 输出:输入序列的一个排列<b1, b2, ..., bn>,满足 b1 ≤ b2 ≤ ... ≤ bn. 插入排序 对于插入排序,我们将其伪代码命名为Insertion-sort,其中的参数是一个数组A[1..n],包含长度为n的要排序的一个序列.(在代码中,A中元素的数目n用A.length来表示.)该算法原址排序输入的数:算法在数组A中重排这些数,在任何时候,最多只有其中的常数个数字存储在数组外面.在过程Ins

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

目录: 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

《算法导论》插入排序

2017-08-17 11:40:36 writer:pprp 最简单的插入排序,用代码实现思想 1 #include <iostream> 2 #include <string> 3 #include <fstream> 4 #include <cstring> 5 6 using namespace std; 7 const int maxn = 9999; 8 int a[maxn]; 9 int N; 10 11 void init() 12 { 1

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

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

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

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] 构成已排好序,每次与左

插入排序——算法导论

最近在看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

算法导论学习 之 插入排序

刚刚开始系统学习算法导论和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

算法导论(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