• 基础算法学习插入排序


      参考 http://blog.verypod.com/shell-sort-using-java/

         http://blog.csdn.net/shan9liang/article/details/7533466

      排序算法早就学习过,无奈长时间不看还是有很多知识变的模糊。从今天开始每天回顾一下那些年学过的算法。今天回顾的是直接插入排序。在算法的结构中直接插入排序属于插入排序的一种,和直接插入排序同属插入排序的是希尔排序。关系如下:

      

      直接插入排序的基本操作是:将一个记录插入到已经排好序的有序表中, 得到一个新生成的有序表。当所有待排序的记录都插入得到新生成的有序表中时,排序结束。

     java算法实现

    public static void main(String[] args) {
    		int numbers[] = { 23, 53, 11, 34, 51 };
    		sort(numbers);
    	}
    
    	public static void sort(int[] list) {
    		
    		int number[] = list;
    
    		int temp = 0;//暂存
    		
    		for (int i = 1; i < number.length; i++) {
    
    			int j;
    
    			temp = number[i];//暂存
    
    			for (j = i - 1; j >= 0 && temp < number[j]; j--) {
    
    				number[j + 1] = number[j]; // 后移
    
    			}
    
    			number[j + 1] = temp;
    
    		}
    
    		for (int i = 0; i < number.length; i++)
    
    			System.out.println("The "+i+" number is :"+number[i]);
    
    	}
    

      分析:直接插入排序的时间复杂度为O(N平方),当带排序队列为递增有序时,时间复杂度为O(N)。

      

      希尔排序的基本思想是:先将整个待排序的队列(n个数字)按照一定间隔(d)分割成若干个子序列,各个子序列中采用直接插入排序进行排序,然后再整体排序一次。

    Java算法实现:

    import java.util.Random;
    
    public class ShellSort {
    
        int[] data;
    
        public ShellSort(int num) {
            data = new int[num];
        }
    
        /**
         * 将data数组初始化为随机数数组
         */
        public void randomArray() {
            Random rd = new Random();
            for (int i = 0; i < data.length; i++) {
                data[i] = rd.nextInt(data.length * 2);
            }
        }
    
        /**
         * 将data数组初始化为倒序数组
         */
        public void reverseArray() {
            for (int i = 0; i < data.length; i++) {
                data[i] = data.length - i;
            }
        }
    
        /**
         * 打印数组
         */
        public void display() {
            for (int i = 0; i < data.length; i++) {
                System.out.print(data[i] + " ");
            }
            System.out.println("");
        }
    
        /**
         * 希尔排序
         */
        public void shellSort() {
            int interval = 1;
            while (interval < data.length) {
                interval = interval * 3 + 1;
            }
            
            interval = (interval - 1) / 3;
    
            while (interval >= 1) {
                for (int i = 0; i < interval; i++) {
                    insertSort(i, interval);
                }
                display();
                System.out.println("interval is : " + interval);
                interval = (interval - 1) / 3;
            }
        }
    
        /**
         * 插入排序,该方法会被希尔排序调用
         * 
         * @param startIndex
         *            是排序起始索引
         * @param interval
         *            元素之间的间隔
         */
        public void insertSort(int startIndex, int interval) {
            for (int i = startIndex + interval; i < data.length; i += interval) {
                int j = i - interval;
                int temp = data[i];
                while (j >= startIndex && temp < data[j]) {
                    data[j + interval] = data[j];
                    j -= interval;
                }
                data[j + interval] = temp;
            }
        }
    
        public static void main(String[] args) {
            ShellSort shellSort = new ShellSort(2);
             shellSort.reverseArray();
    //        shellSort.randomArray();
            shellSort.display();
            shellSort.shellSort();
            shellSort.display();
        }
    
    }
  • 相关阅读:
    Android 联系人中使用的常量
    Android 获取联系人Uri
    Android 编辑联系人
    Android 删除联系人
    Android 联系人添加
    Android 联系人查询
    CollectionViewMasonryLayout
    centos7搭建redis
    centos7搭建zookeeper
    排序算法
  • 原文地址:https://www.cnblogs.com/liveandlearn/p/2973873.html
Copyright © 2020-2023  润新知