zoukankan      html  css  js  c++  java
  • 数据结构精要------直接插入排序和希尔排序算法

    上篇总结中主要实践了算法的内排序的选择排序。那么接下来我们继续实践插入排序排序的两种:直接插入排序和希尔排序算法。

    -----接插入排序

    package com.sort;
    
    /**
     * 直接插入排序
     * 
     * @author weixing-yang
     * 
     * 算法思路:
     *  每步将一个待排序的元素,插入到前面已排序好的一组元素中的适当位置, 
     *  直到所有元素所有出入完毕为止。
     */
    public class InsertionSort {
    
    	public void insertionSort(int[] arr, int n) {
    		for (int i = 1; i < n - 1; i++) {
    			int temp = arr[i];//取得第二个元素
    			if (temp < arr[i - 1]) {
    				int j;
    				for (j = i-1; j >= 0 && arr[j] > temp; j--) {
    					arr[j+1] = arr[j];
    				}
    				arr[j+1] = temp;
    			}
    		}
    	}
    }
    ----- 希尔排序

    希尔排序(Shell Sort)是插入排序的一种,是将整个无序列切割成若干小的子序列分别进行插入排序。


    package com.sort;
    
    /**
     * 希尔排序
     * @author weixing-yang
     *
     *	算法思路
     *	先取出一个正整数d1<n,把全部序号相隔d1的元素分别放置一个组中。各组内进行直接插入排序。
     *  然后在取d2<d1,反复上述分组和排序操作。直至di =1,即全部记录放到一组中排序为止。
     *  
     */
    public class ShellSort {
    	
    	public void shellSort(int[] arr, int n){
    		int i,j,k,temp;
    		k = (n-1)/2;
    		while(k > 0){
    			for (i = k; i < n-1; i++) {
    				temp = arr[i];
    				for (j = i-k; j >= 0 && arr[j] > temp; j -= k) {
    					arr[j+k] = arr[j];
    				}
    				arr[j+k] = temp;
    			}
    			k/=2;
    		}
    	}
    }
    -----測试函数

    package com.sort;
    
    public class Main {
    	
    	public static void main(String[] args){
    		int[] array = {36, 25, 45,40, 12, 34, 55}; 
    		int n = array.length;
    		InsertionSort insert = new InsertionSort();
    		ShellSort shell = new ShellSort();
    		long start = System.currentTimeMillis();
    		//insert.insertionSort(array, n);
    		shell.shellSort(array, n);
    		long end = System.currentTimeMillis();
    		long sum = end - start;
    		System.out.println("排序花费的总毫秒数:"+sum);
    		for (int i = 0; i < array.length; i++) {
    			System.out.print(array[i]+" ");
    		}
    	}
    }

    -----执行结果

    排序花费的总毫秒数:0
    12 25 34 36 40 45 55 

    直接插入排序是稳定排序,时间复杂度是n2,希尔排序是不稳定排序。


    @@------->>下篇继续实践归并排序的两种排序算法。



  • 相关阅读:
    最短路总结
    关于最小生成树(并查集)prime和kruskal
    关于优先队列浅析(priority_queue)
    惨痛第十届蓝桥杯总结(附录蓝桥省赛知识点总结)-C++ B组
    初识STL vector
    sort();对结构体数组的排序
    Git 分支管理
    Git 远程仓库
    Matlab R2016a 破解教程
    Ubuntu卡在logo界面
  • 原文地址:https://www.cnblogs.com/mengfanrong/p/5069986.html
Copyright © 2011-2022 走看看