插入排序(数据是局部有序的)

在数据中选择一个作为标识,如果左侧的比标识数据大,那么将标识的位置与标识左侧数据进行调换,否则保持不变。
public int[] initData(){
int[] data = {2,3,4,8,9,7,5,6,10,1};
return data;
}

public static void order(int[] data){
int in,out,temp;
for(out = 1 ; out<data.length;out ++){
temp = data[out];
in = out;
while(in > 0 && data[in - 1] >= temp){
data[in] = data[in - 1];
-- in;
}
data[in] = temp;
}

for(int j : data){
System.out.print(j);
}
}

public static void main(String[] args) {
order(new Insert().initData());
}

时间: 2024-08-27 13:56:18

插入排序(数据是局部有序的)的相关文章

插入排序与shell排序(希尔排序)

1 .插入排序的过程如同我们平时打扑克牌取牌插入的过程,不断将取出的扑克牌插入已经排好的地方. 插入排序过程初始有序区间大小为1,取出无序区间的首元素,查找有序区间的合适位置,进行插入.不断重复上述过程,即可完成操作. 图解示例 1 //插入排序 2 //karllen @2015 3 void insertSort() 4 { 5 int i ,j ,temp; 6 for(i = 1;i<n;++i) //从第二个元素开始插入 7 { 8 temp = a[i]; //a[i]会被覆盖,临时

《STL系列》之map原理及实现

上一篇文章<STL系列>之vector原理及实现,介绍了vector的原理及实现,这篇文章介绍map的原理及实现.STL实现源码下载.STL中map的实现是基于RBTree的,我在实现的时候没有采用RBTree,觉得这东西有点复杂,我的map采用的是排序数组(CSortVector).map中的Key存在排序数据中,通过二分查找判断某个Key是否在map中,时间复杂度为O(logN).在用一个CVector存Key和Value,为了方便拿到Key和Value,这里有点冗余,Key被存了两次.现

数据结构与算法之--高级排序:shell排序和快速排序【未完待续】

高级排序比简单排序要快的多,简单排序的时间复杂度是O(N^2),希尔(shell)排序的是O(N*(logN)^2),而快速排序是O(N*logN). 说明:下面以int数组的从小到大排序为例. 希尔(shell)排序 希尔排序是基于插入排序的,首先回顾一下插入排序,假设插入是从左向右执行的,待插入元素的左边是有序的,且假如待插入元素比左边的都小,就需要挪动左边的所有元素,如下图所示: ==> 图1和图2:插入右边的temp柱需要outer标记位左边的五个柱子都向右挪动 如图3所示,相比插入排序

LeetCode :: Insertion Sort List [详细分析]

Sort a linked list using insertion sort. 仍然是一个非常简洁的题目,让我们用插入排序给链表排序:这里说到插入排序,可以来回顾一下, 最基本的入门排序算法,就是插入排序了:时间复杂度为n^2,最基本的插入排序是基于数组实现的,下面给出基于数组实现的插入排序,来体会一个插入排序的思想: 以下仅为数组实现,不是解题代码,没兴趣可以跳过. void insertionsort (int a[], int N) { for (int i = 1; i < N; i+

[技术] OIer的STL入门教程

注: 本文主要摘取STL在OI中的常用技巧应用, 所以可能会重点说明容器部分和算法部分, 且不会讨论所有支持的函数/操作并主要讨论 C++11 前支持的特性. 如果需要详细完整的介绍请自行查阅标准文档. 原始资料源于各大C++参考信息网站/C++标准文档和Wikipedia. 1.概述 首先, 什么是STL? STL, 即标准模板库, 全称Standard Template Library , 主要包含4个组件, 即算法, 函数, 容器, 迭代器. 这里的函数似乎主要指函数式编程(FP)中的函数

堆的概念及实现

1.概述: 堆的概念:堆是一种完全二叉树,其高度为log(n),可以用一维数组来实现.堆中存储的数据是局部有序的.可分为两种堆:最大顶堆和最小顶堆. 最大顶堆:任意一个结点的值都大于等于其任意一个子结点的值. 最小顶堆:任意一个结点的值都小于等于其任意一个子结点的值. 可以发现,堆的罗辑结构是树状结构,而存储结构是线性结构,因此,堆常用来实现优先队列.还可又来堆排序等. 2.基本操作: 存储:显然,堆的元素可以保存在一维数组heap[]中,1表示根结点,结点k的父亲是k/2,左儿子是2×k,右儿

【数据结果与算法】插入排序算法

java语言实现 void insertionSort(int[] A) { for(int i=1;i<A.length;i++) { int value=a[i]; int j=i-1; while(a[j]>value&&j>=0) { a[j+1]=a[j]; j--; } a[j]=value; } }

插入排序算法---插入排序与希尔排序

本文主要说明插入排序.shell排序两种排序方法.  一.插入排序  算法思想:  假定这个数组的序是排好的,然后从头往后,如果有数比当前外层元素的值大,则将这个数的位置往后挪,直到当前外层元素的值大于或等于它前面的位置为止.这具算法在排完前k个数之后,可以保证a[1…k]是局部有序的,保证了插入过程的正确性. 一般来说,插入排序都采用in-place在数组上实现.具体算法描述如下: ⒈ 从第一个元素开始,该元素可以认为已经被排序 ⒉ 取出下一个元素,在已经排序的元素序列中从后向前扫描 ⒊ 如果

java面向对象的冒泡排序,选择排序和插入排序的比较

这三种排序有俩个过程: 1.比较俩个数据. 2.交换俩个数据或复制其中一项. 这三种排序的时间级别 冒泡排序:比较 (N-1)+(N-2)+...+2+1 = N*(N-1)/2=N2/2 交换  0——N2/2 = N2/4 总时间 3/4*N2 选择排序:比较 (N-1)+(N-2)+...+2+1 = N*(N-1)/2=N2/2 交换  0——3*(N-1)=3*(N-1)/2=3/2*N 总时间 N2/2+3/2*N 插入排序:第一轮最多比较一次,第二轮最多比较俩次,最后一轮比较N-1