您的位置:首页 > 其它

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

2019-07-25 10:30 197 查看
原文链接:http://www.cnblogs.com/liveandlearn/archive/2013/03/21/2973873.html

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

}

 

 

 

转载于:https://www.cnblogs.com/liveandlearn/archive/2013/03/21/2973873.html

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: