BasicSort — InsertionSort

一、插入排序  

核心:通过构建有序序列,对于未排序序列,在已排序序列中从后向前扫描(对于单向链表则只能从前往后遍历),找到相应位置并插入。实现上通常使用in-place排序(需用到O(1)的额外空间)

  1. 从第一个元素开始,该元素可认为已排序
  2. 取下一个元素,对已排序数组从后往前扫描
  3. 若从排序数组中取出的元素大于新元素,则移至下一位置
  4. 重复步骤3,直至找到已排序元素小于或等于新元素的位置
  5. 插入新元素至该位置
  6. 重复2~5

性质:

  • 交换操作和数组中倒置的数量相同
  • 比较次数>=倒置数量,<=倒置的数量加上数组的大小减一
  • 每次交换都改变了两个顺序颠倒的元素的位置,即减少了一对倒置,倒置数量为0时即完成排序。
  • 每次交换对应着一次比较,且1到N-1之间的每个i都可能需要一次额外的记录(a[i]未到达数组左端时)
  • 最坏情况下需要~N^2/2次比较和~N^2/2次交换,最好情况下需要N-1次比较和0次交换。
  • 平均情况下需要~N^2/4次比较和~N^2/4次交换

二、实现

  实现方式一:

package sort;

public class InsertionSort {
	/**
	 * 插入排序:
	 *  1、从第一个元素开始,该元素可认为已排序
		2、取下一个元素,对已排序数组从后往前扫描
		3、若从排序数组中取出的元素大于新元素,则取出的元素移至下一位置
		4、重复步骤3,直至找到已排序元素小于或等于新元素的位置
		5、插入新元素至该位置
		6、重复2~5
	 * @param args
	 */
	public static void main(String[] args) {
		int[] unsortedArray = new int[]{6, 5, 3, 1, 8, 7, 2, 4};
		insertionSort(unsortedArray) ;
		System.out.println("After sort: ");
		for (int item : unsortedArray) {
			System.out.print(item + " ");
		}
	}
	public static void insertionSort(int[] array){
		int len = array.length;
		for (int i = 0; i < len; i++) {
			int index = i, temp = array[i] ;
			while (index > 0 && array[index - 1] > temp) {
				array[index] = array[index - 1] ;
				index -= 1 ;
			}
			array[index] = temp ;
			for (int item : array) {
				System.out.print(item + " ");
			}
			System.out.println();
		}
	}
}

  实现方式二:

  定义一个类,实现插入排序,并显示元素。

package insertionSort;

public class ArrayIns
{
	private long[] a ;				// ref to Array a
	private int nElems ;			// number of data items

	public ArrayIns(int max){		// constructor
		a = new long[max] ;			// create the array
		nElems = 0 ;				// no items yet
	}

	public void insert(long value){	// put element into array
		a[nElems] = value ;			// insert it
		nElems++ ;					// increment size
	}

	public void display(){			// display array contents
		for (int i = 0; i < nElems; i++) {
			System.out.print(a[i] + " ");
		}
		System.out.println();
	}

	public void insertionSort(){
		int out , in ;
		for (out = 1; out < nElems; out++) {  // outer loop
			long temp = a[out] ;			  // remove marked item
			in = out ;						  // start shifts at out
			while(in > 0 && a[in-1] >= temp){
				a[in] = a[in-1] ;			  // shift item to right
				in-- ;						  // go left one position
			}
			a[in] = temp ;					  // insert marked item
		}
	}
}

   定义主程序入口,main函数

package insertionSort;

import bubbleSort.ArrayBub;

public class InsertionSort {

	public static void main(String[] args) {
		int maxSize = 100 ;				// array size
		ArrayIns arr  ;					// reference to array
		arr = new ArrayIns(maxSize) ;	// create the array

		arr.insert(6);
		arr.insert(5);
		arr.insert(3);
		arr.insert(1);
		arr.insert(8);
		arr.insert(7);
		arr.insert(2);
		arr.insert(4);

		arr.display();					// display items

		arr.insertionSort();				// bubble sort them

		arr.display();					// display items again
	}

}

  

时间: 2024-10-05 17:01:56

BasicSort — InsertionSort的相关文章

插入排序(insertion-sort)

作为排序算法的一种,插入排序是稳定排序.它的时间复杂度:O(n*n),空间复杂度为:O(1).最好的时间复杂度为:O(n),最坏和平均则为:O(n*n). 算法的思想:给定一组无序的数组,我们从它的第二个数开始,并将它赋值给mark变量,让mark和它前面的一个数作大小比较,若小于前面的那个数,则将前面那个数移动到它的位置.然后继续让它和它前面的数作大小比较,若小于则交换位置,若大于则将mark赋值给合适的位置,然后跳出循环,则又从下一个数开始重复如此步骤. 贴出相关代码: #include <

排序-InsertionSort 插入排序

插入排序 の implementation 插入排序就像打赌的时候,比如双扣.抽牌的时候,一次拿一张牌,这张牌和之前的牌一张张比较.选择把这张牌插入什么位置,排好顺序的位置后打牌更顺.要不然得一个一个找到时麻烦.也不利于打牌的大局观.看下图 假设第一次抽到梅花7, 不用排序.因为只有一张 接着抽到梅花10 .因为10比7大,所以不用排序. 再接着抽卡.发现抽到了梅花5 .这个时候不要犹豫,2点真的不算大的.果断弃牌 接着我们拿 5 和 10 比较. 5 小于 10 所以交换位置. 拿5再和7比.

插入排序 Insertion-sort

---恢复内容开始--- 插入排序 经典显示(参照算法导论) 一副扑克牌放在桌面上 花色朝下,每次从桌面上拿去最上面的一张 ,放入自己手中的牌中的正确位置,(每次都是对手中的牌排序,并且每次拿去桌面上的牌时,手中的牌已经排序好,当桌上的牌没有时,所有的排序都已经排序好.   其中注意点:将后面一张牌与前一张比如果小于就交换位置. 办法二 [最佳方法]将最后一张牌与 for循环下面的每个元素比A[i],若小于就向后移一位A[i+1] = A[i], 但是刚拿过的牌 j 必须要付给一个临时变量来保存

插入排序算法(insertion-sort)

一.用途: 输入:n个数(a1,a2,...,an) 输出:输入序列的一个排列(即重新排序)<a1',a2',...,an'>,使得a1' <= a2' <= ...an'. 待排序的数成为关键字key. Insertion-sort的参数是一个数组A[1,2,...,N],包含n个待排序的数.(在代码中,A中元素个数n用length[A]表示).输入的个数字是原地排序的(sorted in place),意即这些数字就是在数组A中进行重新排序的.在任何时刻,至多只有其中的常数个数

插入排序(InsertionSort)

位置p上的元素存储于tmp(第一趟p通常取1),而(位置p之前)所有更大的元素都向右移动一个位置. 然后tmp被放在正确的位置上. 代码: public class InsertionSort { private int q; int[] insertionSort(int[] a) { for (int p = 1; p < a.length; p++) { int temp = a[p]; for (q = p; q > 0 && (temp - a[q - 1]) <

InsertionSort 直接插入排序(java)

排序思想: 相当于一堆数字,一开始先取出2个数排序,2个数排好序之后,再从一堆数字里面取一个数排序,直到结束伪代码: INSERTION_SORT(A) for j = 2 to A.length key = A[j] //Insert A[j] into sorted sequence A[1...j-1]. i = j - 1 while i>0 and A[i]>key A[i+1] = A[j] i = i - 1 A[i + 1] = key 代码: import java.io.*

插入排序InsertionSort

/** * * @author Administrator * 功能:插入排序法 */ package com.test1; import java.util.Calendar; public class InsertionSort { public static void main(String[] args) { // TODO Auto-generated method stub int[] arr = new int[50000]; for (int i = 0; i < arr.len

插入排序(InsertionSort)

生活中的"插入排序" 扑克牌我们大部分人都玩过,当然也都知道该怎么把刚抓上来的牌放哪里,最后得到一手排好的牌.但其中所蕴含的算法原理 不知道你有没有想过.计算机科学家把人的这一直观想法翻译为计算机程序于是便有了我们所说的插入排序: 图示 代码(C++) /************************************* 函数:插入排序 说明:对区间[low, high)的数据排序 时间复杂度:O(n + inverse) ***************************

InsertionSort

1 public class InsertionSort { 2 3 public static void main(String[] args) { 4 //随机生成5个0到100之间的数 5 int [] arr = new int[5]; 6 for(int i = 0; i < arr.length; i++) { 7 arr[i] = (int) (Math.random() * 100); 8 System.out.println(arr[i]); 9 } 10 //i控制轮数,从第