c语言--直接插入算法

插入排序是排序算法的一种,它不改变原有的序列(数组),而是创建一个新的序列,在新序列上进行操作。

这里以从小到大排序为例进行讲解。

插入排序的基本思想是,将元素逐个添加到已经排序好的数组中去,同时要求,插入的元素必须在正确的位置,这样原来排序好的数组是仍然有序的。

在实际使用中,通常是排序整个无序数组,所以把这个无序数组分为两部分排序好的子数组和待插入的元素;

第一轮时,将第一个元素作为排序好的子数组,插入第二个元素;

第二轮,将前两个元素作为排序好的数组,插入第三个元素;

以此类推,第i轮排序时,在前i个元素的子数组中插入第i+1个元素。直到所有元素都加入排序好数组。

下面,以对 3  2  4  1 进行选择排序说明插入过程,使用j记录元素需要插入的位置。排序目标是使数组从小到大排列。

第1轮

[ 3 ]  [ 2  4  1 ]  (最初状态,将第1个元素分为排序好的子数组,其余为待插入元素)

[ 3 ]  [ 2  4  1 ]  (由于3>2,所以待插入位置j=1)

[ 2  3 ]  [ 4  1 ]  (将2插入到位置j)

第2轮

[ 2  3 ]  [ 4  1 ] (第1轮排序结果)

[ 2  3 ]  [ 4  1 ] (由于2<4,所以先假定j=2)

[ 2  3 ]  [ 4  1 ] (由于3<4,所以j=3)

[ 2  3  4 ]  [ 1 ] (由于4刚好在位置3,无需插入)

第3轮

[ 2  3  4 ]  [ 1 ] (第2轮排序结果)

[ 2  3  4 ]  [ 1 ] (由于1<2,所以j=1)

[1  2  3  4 ]    (将1插入位置j,待排序元素为空,排序结束)

算法总结及实现

选择排序对大小为N的无序数组R[N]进行排序,进行N-1轮选择过程。首先将第1个元素作为已经排序好的子数组,然后将剩余的N-1个元素,逐个插入到已经排序好子数组;。因此,在第 i轮排序时,前i个元素总是有序的,将第i+1个元素插入到正确的位置。

复制纯文本新窗口
  1. #include<stdio.h>
  2. #include<stdlib.h>
  3. #include<iostream>
  4. using namespace std;
  5. void insert_sort(int a[],int &n);  //使用C++中引用操作;
  6. int main()
  7. {
  8. int num[] = {89, 38, 11, 78, 96, 44, 19, 25};
  9. //数据元素的个数:
  10. int N=sizeof(num)/sizeof(N[0]);
  11. insert_sort(num,N);
  12. for(int i=0; i<N; i++)
  13. cout<<num[i]<<endl;
  14. system("pause");
  15. return 0;
  16. }
  1. //插入排序实现,这里按从小到大排序
  2. void insert_sort(int a[],int &n) //n为数组a的元素个数,这里采用c++中的引用操作;
  3. {
  4. int t=0;
  5. for(int i=2-1; i<=n-1; i++)
  6. {
  7. if(a[i]<a[i-1])//首先找到元素a[i]需要插入的位置
  8. {
  9. t=a[i];
  10. for(int j=i-1;a[j]>t;j--)
  11. a[j+1]=a[j];
  12. //将元素插入到正确的位置
  13. a[j+1]=t;
  14. }
  15. }
  16. }

注意:插入排序是一种稳定的排序算法,不会改变原有序列中相同数字的顺序。

插入排序是在一个已经有序的小序列的基础上,一次插入一个元素。当然,刚开始这个有序的小序列只有1个元素,就是第一个元素。比较是从有序序列的末尾开始,也就是想要插入的元素和已经有序的最大者开始比起,如果比它大则直接插入在其后面,否则一直往前找直到找到它该插入的位置。如果碰见一个和插入元素相等的,那么插入元素把想插入的元素放在相等元素的后面。所以,相等元素的前后顺序没有改变,从原无序序列出去的顺序就是排好序后的顺序,所以插入排序是稳定的。

时间: 2024-08-24 20:05:18

c语言--直接插入算法的相关文章

C语言排序算法复习

排序算法有很多种,这里在复习和分析的基础上,做一个自己的总结: 首先要知道有哪些排序算法,google一下,有云C语言7大经典排序算法(也有8大).主要包括冒泡排序,快速排序,选择排序,插入排序,希尔排序,归并排序,堆排序,8大的还有基数排序.各有各的版本,代码写法也各不相同.所以这里以整理思路为先,代码只是作为自己的一个备份. 搞清楚的概念:稳定排序和不稳定排序,就看序列中两个值相等的数,排完序之后的相对位置是否改变,如果改变了就不稳定. 内部排序和外部排序,只用到内存即可完成排序的就叫内部排

杂文 - [1.1]使用库语言排序算法

[1.1]使用库语言排序算法 本文地址: http://blog.csdn.net/caroline_wendy 如果不缺少内存, 可以直接使用库的排序算法. 使用库语言的排序程序: C语言性能最好的算法是快速排序(quick sort). C++性能最好的是集合(set)的排序算法. C语言代码: /* * main.cpp * * Created on: 2014.6.12 * Author: Spike */ /*eclipse cdt, gcc 4.8.1*/ #include <std

2015lopdev生态联盟开发者大会:股市中的R语言量化算法模型

前言 记得10年前还在上学的时候,总是参加IBM的大会,看着各种新技术从实验室创造,特别地神奇.今天我也有机会站在了IBM大会的讲台上,给大家分享我所研究的R语言技术,对我来说也是一件非常有纪念意义的事情. 感谢IBM主办方的邀请,也真心希望有机会与IBM建立合作机会. 目录 我的演讲主题:股市中的R语言量化算法模型 会议体验和照片分享 整体文章:http://blog.fens.me/meeting-lopdev-20150922/

C语言排序算法总结

学计算机程序设计的应该都知道,算法是程序之魂.所谓算法,就是解决问题的方法加上有限的实现步骤.算法的特点有有穷性,确定性,有效性,有零个或多个输入,有一个或多个输出.下面我们就来简单总结一下C语言中的三种经典排序算法. 一.冒泡算法. 所谓冒泡排序法,就是对一组数字进行从大到小或从小到大排序的一种算法.具体方法是,相邻的数字两两交换.从第一个数值开始,如果相邻两个数的排列顺序与我们的期望不相同,则将两个数的位置进行交换(对调):如果其余我们期望的相同,则不交换位置.重复这样的过程,一直到最后没有

C语言快速排序算法代码分析

最近在很多场合都看见设计模式的影子,一直以来,都投入主要时间在搞算法与数据结构,很来发现设计模式真的很重要.有的时候代码的可维护.可重用.可扩展确实胜过单纯的算法效率高.所以拾起大牛书籍<大话设计模式>同时参考网上诸大牛的博客,开始我的设计模式之旅.由于平时编程时用C/C++,现在是Java,也练练Java语法. 今天先介绍一下命令模式. 概念: 命令模式(Command):将一个请求封装成一个对象,从而使你可用不同的请求对象对客户进行参数化,对请求排队或记录请求日志,以及支持可撤销的操作.

C语言的算法

什么是算法|算法的概念 一个程序应包括: 对数据的描述:在程序中要指定数据的类型和数据的组织形式,即数据结构(data structure). 对操作的描述:即操作步骤,也就是算法(algorithm). Nikiklaus Wirth提出的公式:程序=数据结构+算法 这三个方面是一个程序涉及人员所应具备的知识.本教程的目的是使同学知道怎样编写一个C程序,进行编写程序的初步训练,因此,只介绍算法的初步知识. 做任何事情都有一定的步骤.为解决一个问题而采取的方法和步骤,就称为算法. 简单的C语言算

Java学习资料-Java常用算法-直接插入算法

SortAscending源程序public class SortAscending { public SortAscending () {  System.out.println("直接插入排序法"); } public static int[] sortAscending(int[] with) { // 直接插入法递增排序  int length = with.length;      // 待排数组的长度  int[] temp = new int[length];    //

Java直接插入算法

直接插入算法是将N个带排序的元素看做成一个有序表和一个无序表. 每次从无序表中取一个元素和有序表比较,重复N-1次完成排序. 直接上代码: 1 package test; 2 3 public class Test { 4 public static void main(String[] args) { 5 int[] data = new int[] { 23, 1, 5, 7, 45, 26, 77, 3, 2 }; 6 showArray(data); 7 sortArray(data);

C语言经典算法五个人问岁数!——————【Badboy】

有5 个人坐在一起,问第五个人多少岁?他说比第4 个人大2 岁.问第4 个人岁数,他说比第3 个人大2 岁.问第三个人,又说比第2 人大两岁.问第2 个人,说比第一个人大两岁.最后问第一个人,他说是10 岁.请问第五个人多大? 1.程序分析:利用递归的方法,递归分为回推和递推两个阶段.要想知道第五个人岁数,需知道第四人的岁数,依次类推,推到第一人(10 岁),再往回推. 2.程序源代码: #include #include int main() { int i=5; int age(int);