基础算法学习--插入排序

  参考 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();
    }

}

 

 

 

posted @ 2013-03-21 17:32  Live and Learn  阅读(165)  评论(0编辑  收藏  举报