(直接)插入排序INSERT_SORT

2024-06-18 14:38

本文主要是介绍(直接)插入排序INSERT_SORT,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

一、伪代码

/*INSERT_SORT(A)*/
for j = 2 to A.lengthkey = A[j]//Insert A[j] into the sorted sequence A[1..j-1].i = j-1while i>0 and A[i]>keyA[i+1] = A[i]i = i-1
A[i+1] = key

二、算法描述

数组A[1..n]是一个包含n个元素的待排序的序列,其长度用A.length表示,显然有A.length=n.从序列A的第二个元素开始,在循环变量为j的for循环中,每次迭代开始时,包含元素A[1..j-1]的子序列是已经排序好的序列,剩下的子序列A[j+1..n]就是待排列的序列,而元素A[j]就是待插入(已排列好的序列A[1..j-1]中)元素,待排列中的第一个元素取就是下一次待插入的元素。将待排列元素A[j]的值存储在临时变量key中,然后key和A[j-1]即A[i]比较大小。当key的值小于已排列好的序列A[1..j-1]中的最大值即A[j-1],那么将A[j-1]向后移动一位即将A[j-1]的值赋给A[j],(此时A[j]的值仍然保存在变量key中,所以不必担心A[j]的值被覆盖)这一步是通过语句A[i+1]=A[i](i=j-1)来实现的。接着执行语句i=i-1,回到while语句的条件判断A[i]>key,即将key的值和已经排列好的序列中的第二大的元素A[j-2]即A[i](此时i=(j-1)-1),如果条件满足则重复上一过程,否则跳出while循环,并把key的值赋给元素A[i+1],至此完成了一次插值,即为元素A[j]找到了合适的插入位置。

简单来说,(直接)插入排序算法就是依次从序列A[1..n]中取出一个元素A[j]并与前一个元素A [j-1]相比,如果取出的元素的值A[j]比之前一个元素的值A[j-1]大,则将取出的元素A[j]放在前一个元素A[j-1]之后,否则将取出的元素A[j]和前一个元素A[j-1]的前一个元素A[j-2]相比,重复该过程,直到找到第一个小于取出的元素A[j]的元素A[i],则将取出的元素A[j]放在元素A[i]之后,完成了一次插入排序。重复上述过程,直到完成所有元素的排序。

【注】上述过程假设将序列A[1..n]按照从小到大的顺序进行排序。


三、C语言源代码

/******************************
*源代码(一) By 羽墨
*根据《算法导论》中伪代码编写
*******************************/
void insert_sort(int *A)
{int length = 6;int i=0,j=0;int key=0;for(j=1;j<=length-1;j++){key = A[j];//Insert A[j] into the sorted sequence A[1..j-1].i = j-1;while(i>=0&&A[i]>key){A[i+1] = A[i];i = i-1;}A[i+1] = key;}
}


/******************************
*源代码(二)   By 羽墨
*在理解上述代码的基础上重新编写
*******************************/
void insert_sort(int *A)
{int i=0;int length = 6;int key = A[0];for(i=0;i<length;i++){int j = 0;key = A[i];for(j=i-1;j>=0;j--){if(key<A[j]){A[j+1] = A[j];}else{break;}}A[j+1] = key;}
}


/*****************************
*主函数  By 羽墨
*****************************/
void main()
{int array[] = {5,2,4,6,1,3};//初始化待排序数组printf("The original");print_array(array);//打印原始数组insert_sort(array);printf("The sorted");print_array(array);//打印排序后的数组
}

/**********************运行结果********************/
The original array = [5 2 4 6 1 3 ] //原始数组
The sorted array = [1 2 3 4 5 6 ]   //排序后的数组

其中,数组打印函数为print_array()。

/******************************
*数组打印函数 By 羽墨
*******************************/
void print_array(int *array)
{int i = 0;printf(" array = [");for(i=0;i<=5;i++){printf("%d ",array[i]);}printf("]\n");
}

以上代码为笔者阅读《算法导论》时的练习笔记,作记录之用,在VC++ 6.0环境中编译通过,仅供参考!





这篇关于(直接)插入排序INSERT_SORT的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1072275

相关文章

usaco 1.3 Mixing Milk (结构体排序 qsort) and hdu 2020(sort)

到了这题学会了结构体排序 于是回去修改了 1.2 milking cows 的算法~ 结构体排序核心: 1.结构体定义 struct Milk{int price;int milks;}milk[5000]; 2.自定义的比较函数,若返回值为正,qsort 函数判定a>b ;为负,a<b;为0,a==b; int milkcmp(const void *va,c

[项目][CMP][直接向堆申请页为单位的大块内存]详细讲解

目录 1.系统调用 1.系统调用 Windows和Linux下如何直接向堆申请页为单位的大块内存: VirtualAllocbrk和mmap // 直接去堆上按页申请空间static inline void *SystemAlloc(size_t kpage){#ifdef _WIN32void *ptr = VirtualAlloc(0, kpage << 13,

stl的sort和手写快排的运行效率哪个比较高?

STL的sort必然要比你自己写的快排要快,因为你自己手写一个这么复杂的sort,那就太闲了。STL的sort是尽量让复杂度维持在O(N log N)的,因此就有了各种的Hybrid sort algorithm。 题主你提到的先quicksort到一定深度之后就转为heapsort,这种是introsort。 每种STL实现使用的算法各有不同,GNU Standard C++ Lib

Hibernate插入数据时,报错:org.springframework.dao.DataIntegrityViolationException: could not insert: [cn.itc

在用junit测试:插入数据时,报一下错误: 错误原因: package junit;import org.junit.Test;import cn.itcast.crm.container.ServiceProvinder;import cn.itcast.crm.dao.ISysUserDao;import cn.itcast.crm.domain.SysRole;

PageOfficeCtrl支持直接打开服务器磁盘文件

一般来说,PageOfficeCtrl控件的WebOpen方法的第一个参数是待打开文档的URL,此URL可以是相对于当前页面的相对URL,也可以是相对于整个网站根的相对URL,还可以是http开头的完整URL,但是这个URL必须是当前网站的URL,不能跨域。 现在为了更加方便开发者编程,WebOpen支持打开服务器磁盘文件。也就是说,第一个参数可以写成服务器文件的绝对磁盘路径。例如: P

最直接显示 ubuntu 版本号的命令

有时候去看ubuntu版本号,去网上查,很多文章都列出一堆命令,复制命令运行一下,都是打印一些不相关的信息,我只是想看ubuntu版本号而已,能否直接列出版本号就可以了。 有,下面这条命令就是直接的打印出ubuntu版本号, 没有多余信息 lsb_release -a

【UVA】10651-Pebble Solitaire(直接递归或者记忆化)

不知道这个题UVA的数据是怎么的,用2个方法交了,第一次直接递归,第二次记忆化剪枝,时间竟然一样!? 直接郁闷了,简单的二进制表示状态和二进制运算。 14145176 10651 Pebble Solitaire Accepted C++ 0.009 2014-09-04 09:18:21 #include<cstdio>#include<algorithm>#inclu

(六十四)第 10 章 内部排序(静态链表的插入排序)

示例代码 staticLinkList.h // 静态链表的插入排序实现头文件#ifndef STATIC_LINK_LIST_H#define STATIC_LINK_LIST_H#include "errorRecord.h"#define SIZE 100#define NUM 8typedef int InfoType;typedef int KeyType;ty

Anthropic 创始人 Dario Amodei 谈:关于护城河与风险,AI 大很难直接替代人

护城河的迷思   近期,Anthropic创始人Dario Amodei与投资人Erik Torenberg进行了一场引人关注的对话。他们探讨了AI的护城河与潜在风险。话说,护城河就像酒水的保质期,过了时间就得小心别翻车。Amodei提到,AI虽有强大的潜力,但短期内难以完全替代人类的智慧。这可让很多人松了一口气,毕竟机器发热总比人心复杂,听着都觉得不舒服。 聪明与控制的博弈   Dar

6.1排序——插入排序与希尔排序

本篇博客来梳理两种常见排序算法:插入排序与希尔排序 常见的排序算法如图 写排序算法的原则:先写单趟,再写整体 一、直接插入排序 1.算法思想 先假定第一个数据有序,把第二个数据插入;再假设前两个数据有序,把第三个数据插入…以此类推,直到整个序列有序 2.具体操作(以排成升序为例) (1)单趟:针对单个数据 假设[0,end]有序,处理end+1处数据(用tmp存起来,原因:挪数据的时