复习数据结构:排序(一)——插入排序

从这一篇开始,我开始复习数据结构的知识点,博文主要偏重于每个知识点的核心思想,以及代码实现。这一篇先从排序算法中的插入排序开始。

稳定排序、内排序、适合少量数据量的排序。

当输入数组已经排好序时,插入排序需要O(n),快排需要O(n^2)。

当输入数组倒序排列时,插入排序时复为:O(n^2)。

平均时间复杂度:O(n^2)。

插入排序的基本做法是:将一个数插入到一个已经排列好的数组中,通过移动这个数的位置,使得插入之后的数组也是有序的,不断重复这个过程,使得最终所有的数都是有序的。

实现代码如下:

#include<iostream>
using namespace std; 

void InsertSort(int a[], int n)
{
	for(int i = 1; i < n; i++)
	{
		if(a[i] < a[i-1])  // a[i]是待排元素,前面i-1个数已经排序好
		{
			int j = i-1;  // 准备前移
			int x = a[i];
			a[i] = a[i-1];
			while(x < a[j])
			{
				a[j+1] = a[j];
				j--;
			}
			a[j+1] = x;
		}
	}
}

int main()
{
	int a[] = {2, 1, 5, 8, 4, 3};
	InsertSort(a, 6); 

	for(int i = 0; i< 6; i++)
		cout<<a[i]<<' ';
	cout<<endl; 

	return 0;
}
时间: 2024-10-13 06:37:33

复习数据结构:排序(一)——插入排序的相关文章

数据结构——排序——直接插入排序和折半插入排序算法

直接插入排序(Insertion Sort)的基本思想是: 每次将一个待排序的记录,按其关键字大小插入到前面已经排好序的子序列中的适当位置,直到全部记录插入完成为止. 设数组为a[0…n-1]: 1. 初始时,a[0]自成1个有序区,无序区为a[1..n-1].令i=1 2. 将a[i]并入当前的有序区a[0…i-1]中形成a[0…i]的有序区间. 3. i++并重复第二步直到i==n-1.排序完成. #include<stdio.h> #include<stdbool.h> vo

数据结构排序-直接插入排序

每次从无序表中取出第一个元素,把它插入到有序表的合适位置,使有序表仍然有序. 第一趟比较前两个数,然后把第二个数按大小插入到有序表中: 第二趟把第三个数据与前两个数从前向后扫描,把第三个数按大小插入到有序表中: 依次进行n-1趟扫描后就完成了整个排序过程 1 #include <stdio.h> 2 #include <stdlib.h> 3 4 int n; 5 6 /* 7 * 直接插入排序 8 */ 9 void InsertSort(int *array) 10 { 11

数据结构排序之插入排序

一  插入排序分析      对于这种插入排序呢,我认为这就是另一种排序的思想,逐个拿出每一个元素从该元素的前一个开始比较(从小到大),如果该元 素比它的前元素小,就将前元素的值赋值给该元素,直到不满足条件为止j>=0&&array[j]>min,当循环结束后, 执行 array[j+1]=min;就可以成功的将元素插入,其实这样做的话,数组前面就是有序的,而后面是无序,思想就是这样子了,但是对于时间的复 杂度吗?按照最坏的情况就是倒序时,你在正序排一遍,假如我5个数,5,4,

数据结构 排序(插入排序)

//排序--插入排序法 #include<stdio.h> #include<stdlib.h> #include<string.h> #include<time.h> /* 选择排序(Selection sort)是一种简单直观的排序算法. 它的工作原理是每一次从待排序的数据元素中选出最小(或最大)的一个元素, 存放在序列的起始位置,直到全部待排序的数据元素排完. 选择排序是不稳定的排序方法(比如序列[5, 5, 3]第一次就将第一个[5]与[3]交换,导

数据结构-排序-直接插入排序

直接插入排序 直接插入排序类似对扑克牌的整理,初始情况下把前面第一个看作有序序列,然后后面全是无序. 这个排序写过很多遍,但是每次回顾都感觉到设计者精彩巧妙的安排. #include<iostream> #include<vector> using namespace std; //首先定义测试数组 这里对下标0处定义了一个哨兵, 然后从后往前遍历 //哨兵是为了从后往前遍历时候可以减少一次判断下标问题 int test[]={0,5,44,66,11,12,45,98,58,82

数据结构排序算法插入排序Java实现

public class InsertDemo { public static void main(String args[]) { int[] sort ={4,2,1,3,6,5,9,8,10,7} ; System.out.println("haha"+sort[0]); System.out.println("排序前:"); print(sort); shellSort(sort); System.out.println("\n排序后:"

数据结构和算法-排序算法-插入排序

##################    插入排序        #################### """ 插入算法: alist = [54,26,93,17,77,31,44,55,20] 还是把序列分为两部分, 一开始就把第一个数字认为是有序的, alist = [54, 26,93,17,77,31,44,55,20] 第一轮, 把第二部分的和第一部分的最后一个做比较,如果小就交换, alist = [26,54 93,17,77,31,44,55,20]

JavaScript算法(冒泡排序、选择排序与插入排序)

冒泡排序.选择排序与插入排序复杂度都是指数级别的,放在一起说吧. 介绍一些学习这三个排序方法的比较好的资料.冒泡排序看<学习JavaScript数据结构与算法>介绍的冒泡排序,选择排序看<计算机科学概论(第三版)>里介绍的选择排序,插入排序看<计算机科学概论(第11版)>里介绍的插入排序, 通过这三份资料弄明白实现原理之后,最后看<学习JavaScript数据结构与算法>一书里的JS实现代码. 嗯,这本书里都有现成代码,就不在这儿写了,关键是弄清楚原理,然后

数据结构--排序

插入排序(上)     基本思想:每次将一个待排序的的元素,按其关键字大小插入到已经排好序的子表的适当位置,直到全部元素插完为止.直接插入排序    简写排序思路:     假设待排序的元素存放在R[0.....n-1]中,在排序过程中,将R划分为两个区间,分别为R[0.....i-1]和R[i....n-1](刚开始时i=1,有序区只有R[0]一个元素),    其中,前一个子区间即是一个已经排好序的子区间,即有序区,后一个子区间则是一个待排序的无序区.   直接插入排序的操作即是:将当前无序