zoukankan      html  css  js  c++  java
  • Hark的数据结构与算法练习之插入排序

    算法说明:

    先是拿语言进行一下描述:

    假如是做降序排序,那么从头开始扫描每个数字,使每个数字与它前面的若干数字进行比较,直接找到小于当前数字a(当前数字以a代替)的数字b(小于a的数字以b代替)。 然后将数字a插入到数学b的位置。将数字b到数字a前一位的数字向后移动一位。 至此,排序结束。

    语言表述其实懂这个算法的人能会懂,不懂这个算法的人不太容易看懂,所以还是以例子做一下说明:

    例如有一个数组int[] arrayData = { 5, 9, 6, 7, 4, 1, 2, 3 ,8},一共9个元素。
    假设是降序排序。
    先扫描第二个数,让它与它前面的数进行比较,这时前两个数是{5,9},9大于5,那么把9插入放到5的位置即arrayData[0],把5后移放到arrayData[1]
    再扫描第三个数,这时因为前面排序所以前三个数就变成了{9,5,6},拿6先与前面的5比较,大于5,那么再往前扫描,与9比较,发现小于9,那么我们将6插入放到5的位置即arrayData[1],将5后移到arrayData[2]。
    再扫描第四个数,这时前四个数就变成了{9,6,5,7}, 将7向前扫描进行比较,最终将7插入放到6的位置即arrayData[1],然后6后移放到arrayData[2],5后移放到arrayData[3]
    以此类推,最后得出结果。

    算法复杂度:

    O(n2)

    空间复杂度:

    O(1)

    代码:

    使用语言:Java

    /*
     * 插入排序
     */
    public class InsertionSorting {
    	public static void main(String[] args) {
    		int[] arrayData = { 5, 9, 6, 7, 4, 1, 2, 3, 8 };
    		InsertionSortingMethod(arrayData);
    		for (int integer : arrayData) {
    			System.out.print(integer);
    			System.out.print(" ");
    		}
    	}
    	
    	public static void InsertionSortingMethod(int[] arrayData)
    	{
    		int temp;
    		int index;
    		for (int i = 1; i < arrayData.length; i++) {
    			temp = arrayData[i];
    			index = i - 1;
    			while (index >= 0 && arrayData[index] < temp) {
    				arrayData[index + 1] = arrayData[index];
    				index--;
    			}
    			arrayData[index + 1] = temp;
    		}
    	}
    }
    

      

    结果:

    9 8 7 6 5 4 3 2 1 
    

    论证算法复杂度:因为是双层循环,所以最坏算法复杂度是O(n2)。

    论证空间复杂度:因为作为临时空间进行数据交换的是几个常量,所以空间复杂度是O(1)

  • 相关阅读:
    sql 数据库还原脚本 (kill链接+独占
    最长回文字符串
    UVa 455 Periodic Strings
    UVa 1225 Digit Counting
    UVa 340 Master-Mind Hints
    UVa 10976
    UVa 725
    UVa 11059
    POJ1887 最长下降子序列
    最大连续子序列算法(数组的连续子数组最大和(首尾不相连))
  • 原文地址:https://www.cnblogs.com/hark0623/p/4330303.html
Copyright © 2011-2022 走看看