排序算法一:插入排序(Insertion sort)

最近从网易公开课在看麻省理工学院的公开课《算法导论》,感觉还不错,接下来几篇文章所示学习日记了,不准备对算法细节做过多描述,感兴趣的可以自己去看。

文章分几篇讲经典排序算法,直接上代码,根据结果对算法性能有个直观了解。本篇先说插入排序(insertion sort)。

(一)算法实现

 1 protected void sort(int[] toSort) {
 2         if (toSort.length <= 1) {
 3             return;
 4         }
 5         for (int i = 1; i < toSort.length; i++) {
 6             if (toSort[i] < toSort[i - 1]) {
 7                 int j = i;
 8                 int temp = toSort[i];
 9                 while (j > 0 && temp < toSort[j - 1]) {
10                     toSort[j] = toSort[j - 1];
11                     j--;
12                 }
13                 toSort[j] = temp;
14             }
15         }
16     }

Insertion sort

1)插入排序属于原地排序,节省空间

2)插入排序的时间复杂度是o (n2)

(二)算法性能

**************************************************
Number to Sort is:2500
Array to sort is:{665184,192100,475135,171530,869545,506246,640618,543738,91353,493005...}
Cost time of 【InsertionSort】 is(milliseconds):3
Sort result of 【InsertionSort】:{856,985,2432,3792,3910,3915,4423,4516,4653,4780...}
**************************************************
Number to Sort is:25000
Array to sort is:{99880,631403,265087,597224,876665,955084,996547,879081,197806,926881...}
Cost time of 【InsertionSort】 is(milliseconds):267
Sort result of 【InsertionSort】:{14,14,17,83,97,152,179,199,240,299...}
**************************************************
Number to Sort is:250000
Array to sort is:{777293,731773,508229,920721,338608,707195,940,445210,19071,768830...}
Cost time of 【InsertionSort】 is(milliseconds):21,523
Sort result of 【InsertionSort】:{2,7,7,19,19,21,24,29,30,39...}

相关代码:

 1 package com.cnblogs.riyueshiwang.sort;
 2
 3 import java.util.Arrays;
 4
 5 public class InsertionSort extends abstractSort {
 6     @Override
 7     protected void sort(int[] toSort) {
 8         if (toSort.length <= 1) {
 9             return;
10         }
11         for (int i = 1; i < toSort.length; i++) {
12             if (toSort[i] < toSort[i - 1]) {
13                 int j = i;
14                 int temp = toSort[i];
15                 while (j > 0 && temp < toSort[j - 1]) {
16                     toSort[j] = toSort[j - 1];
17                     j--;
18                 }
19                 toSort[j] = temp;
20             }
21         }
22     }
23
24     public static void main(String[] args) {
25         for (int j = 0, n = 2500; j < 3; j++, n = n * 10) {
26             System.out
27                     .println("**************************************************");
28             System.out.println("Number to Sort is:" + n);
29             int[] array = CommonUtils.getRandomIntArray(n, 1000000);
30             System.out.print("Array to sort is:");
31             CommonUtils.printIntArray(array);
32
33             int[] array1 = Arrays.copyOf(array, n);
34             new InsertionSort().sortAndprint(array1);
35         }
36     }
37 }

InsertionSort.java

 1 package com.cnblogs.riyueshiwang.sort;
 2
 3 import java.text.MessageFormat;
 4
 5 public abstract class abstractSort {
 6     /**
 7      *
 8      * @param toSort
 9      *            array to sort
10      */
11     protected abstract void sort(int[] toSort);
12
13     public void sortAndprint(int[] toSort) {
14         Long begin = System.currentTimeMillis();
15         sort(toSort);
16         Long end = System.currentTimeMillis();
17         System.out.println(MessageFormat.format(
18                 "Cost time of 【{0}】 is(milliseconds):{1}", this.getClass()
19                         .getSimpleName(), (end - begin)));
20         System.out.print(MessageFormat.format("Sort result of 【{0}】:", this
21                 .getClass().getSimpleName()));
22         CommonUtils.printIntArray(toSort);
23     }
24
25 }

abstractSort.java

 1 package com.cnblogs.riyueshiwang.sort;
 2
 3 import java.util.Random;
 4
 5 public class CommonUtils {
 6     private static Random random = new Random();
 7
 8     public static void printIntArray(int[] array) {
 9         System.out.print(‘{‘);
10
11         int length = Math.min(array.length, 10);
12         for (int i = 0; i < length; i++) {
13             System.out.print(array[i]);
14             if (i != length - 1) {
15                 System.out.print(‘,‘);
16             } else {
17                 if (array.length > 10) {
18                     System.out.print("...");
19                 }
20                 System.out.println(‘}‘);
21             }
22         }
23     }
24
25     public static int[] getRandomIntArray(int size, int maxValue) {
26         int[] array = new int[size];
27         for (int i = 0; i < size; i++) {
28             array[i] = random.nextInt(maxValue);
29         }
30         return array;
31     }
32
33     public static void swap(int[] toSort, int i, int j) {
34         int temp = toSort[i];
35         toSort[i] = toSort[j];
36         toSort[j] = temp;
37     }
38 }

CommonUtils.java

时间: 2024-10-03 06:35:05

排序算法一:插入排序(Insertion sort)的相关文章

经典排序算法 – 插入排序Insertion sort

经典排序算法 – 插入排序Insertion sort  插入排序就是每一步都将一个待排数据按其大小插入到已经排序的数据中的适当位置,直到全部插入完毕. 插入排序方法分直接插入排序和折半插入排序两种,这里只介绍直接插入排序,折半插入排序留到“查找”内容中进行.   图1演示了对4个元素进行直接插入排序的过程,共需要(a),(b),(c)三次插入. 以下代码仅供参考,欢迎指正 /// <summary> /// 插入排序 /// </summary> /// <param na

【 python 学习笔记 -- 数据结构与算法 】插入排序 Insertion Sort

[插入排序]:每次保证列表最左端子序列是排好顺序的,然后取下一个元素,扫描其左端的子序列,将其中大于目标元素的元素右移一个位置,直到找到合适的位置将目标元素插入子序列中.逐步增大排序完成的sublist的长度,最终完成整个列表的排序 算法思路如下: 1. 列表最左边第一个元素认为已经排序好了 2. 取下一个元素(目标元素),在它前面已经排序完成的子序列中从后向前扫描 3. 如果子序列中被扫描的当前元素大于目标元素,则将当前元素右移一个位置 4. 重复第3步,直到被扫描的元素小于或等于目标元素 5

排序算法一:直接插入排序

一.算法特性 <一>基本思想: 1.就是将某个元素插入到正确的位置: 2.基本过程:做这样的前提,插入第i个元素时,前i-1个元素都是有序的.因此将A[i]插入到这个有序队列的合适位置,保证:A[n-1] < A[i] <A[n+1];此时就添加进了新元素,并且保证了整个数组是有序的. 3.时间复杂度:T(n) = O(n^2); 二.代码 class InsertSort{ public static void inserSort(int[] A){ int len = A.le

插入排序Insertion sort

插入排序就是每一步都将一个待排数据按其大小插入到已经排序的数据中的适当位置,直到全部插入完毕. 插入排序方法分直接插入排序和折半插入排序两种,这里只介绍直接插入排序. #include <iostream> using namespace std; static void insert_sort(int unsorted[], int length) { for(int i=1; i<length; i++) { int key = unsorted[i]; int j = i - 1;

基础算法之插入排序Insertion Sort

原理 通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入.通常采用in-place排序(即只需用到O(1)的额外空间的排序),因而在从后向前扫描过程中,需要反复把已排序元素逐步向后挪位,为最新元素提供插入空间.相信大家都打过扑克牌,很好理解. 例子 将数组[5,6,3,1,8,7,2,4]进行从小到大排序 排序步骤: 从第一个元素开始,该元素可以认为已经被排序 取出下一个元素,在已经排序的元素序列中从后向前扫描 如果该元素(已排序)大于新元素,将该元素移到下一位置

排序算法一:桶排序

在我们的生活的这个世界到处都是被排序过的东西.站队的时候会按照身高排序,考试的名次需要按照分数排序,网上购物的时候会按照价格排序,电子邮箱中的邮件按照时间排序--可以说排序无处不在.今天简单讲讲最快最简单的排序--桶排序. 尝试一下输入n个0~1000之间的整数,将它们从大到小排序. 代码实现如下: #include <stdio.h> int main() { //桶排序 //先确定变量 //赋初始值 //循环输入数值 //循环输出数值 printf("桶排序\n");

程序算法艺术与实践经典排序算法之Insertion Sort

插入排序(Insertion Sort)的基本思想是每次将一个待排序的记录,按其关键字大小插入到前面已经排好序的子文件中的适当位置,直到全部记录插入完成为止. 基本思想与伪代码 经过j-1遍处理后,A[1..j-1]己排好序.第j遍处理仅将A[j]插入L[1..j-1]的适当位置,使得A[1..j]又是排好序的序列.要达到这个目的,我们可以用顺序比较的方法.首先比较A[j]和A[j-1],如果A[j-1]≤ A[j],则A[1..j]已排好序,第i遍处理就结束了:否则交换A[j]与A[j-1]的

常见排序算法之插入排序

1.直接插入排序 直接插入排序(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.排序完成. 代码如下: void InsertSort(in

插入排序—直接插入排序(Straight Insertion Sort)

基本思想: 将一个记录插入到已排序好的有序表中,从而得到一个新,记录数增1的有序表.即:先将序列的第1个记录看成是一个有序的子序列,然后从第2个记录逐个进行插插入到已入,直至整个序列有序为止. 要点:设立哨兵,作为临时存储和判断数组边界之用. 直接插入排序示例: 如果碰见一个和插入元素相等的,那么插入元素把想插入的元素放在相等元素的后面.所以,相等元素的前后顺序没有改变,从原无序序列出去的顺序就是排好序后的顺序,所以插入排序是稳定的. 直接插入排序(straight insertion sort