排序的方法有很多,一般言,很难说哪一种方法是最好的。每一种方法都有优缺点,有各自应用的环境。排序一般会进行两种操作1、比较两关键字大小;2、将记录从一个位置移到另一个位置;前者通常来说是必要的,而后者则可以通过改变记录存储方式来避免。后面还会用一篇专门的文章来讨论一下怎么来分析这些算法的复杂度。还请您留意,应该就是最近一周出来!(2015.6.20前)
常见的内部排序算法大致可以分为以下六类共十种:
选择排序:(1)直接选择排序;(2)堆排序;
交换排序:(3)冒泡排序;(4)快速排序;
插入排序: (5)直接插入 排序; (6)折半插入排序;(7)Shell排序;
(8)归并排序;
(9)筒式排序;
(10)基数排序;
下面就将用十篇文章分别归纳这十种排序,这一篇是直接插入排序:
直接插入排序是插入排序中最简单的一种,其他两类是:折半插入排序和Sheel(希尔)排序。对于一个n个元素的序列,需要进行n-1趟插入操作。简单说,从第二个元素开始,判断跟第一个元素大小关系,如果第二个小于第一个则需要交换它们的位置。第三个元素再跟第二个元素比,需要注意的的是,前面两个元素已排好序,此时如果第三个元素大于第二个元素则不需要进行任何操作!宏观上看,就好像把一个个元素插入到前面已经排好的序列中,故名插入排序。有些书中,除了考虑排序外还分析了排序的稳定性,简单说就是,两个相等的元素在排序前后相对位置不变。比如排序前[2*, 9 , 4, 2, 7], 排序后[2, 2*, 4, 7 ,9],就不是稳定排序。
源代码如下:
package mymork.c20150614;
//a example to SelectSort
//blog.youkuaiyun.com/code_7
//HanChun at XiDian University
import java.util.Arrays;
//定义了一个数据包装类,用来在体现排序算法稳定性的时候更容易理解!
class DataWrap implements Comparable<DataWrap> {
int data;
String flag;
public DataWrap(int data, String flag){
this.data = data;
this.flag = flag;
}
public String toString(){
return data + flag;
}
public int compareTo(DataWrap dw){
return this.data > dw.data ? 1 : (this.data == dw.data ? 0 : -1);
}
}
public class InsertSort {
public static DataWrap[] insertsort(DataWrap[] data){
for(int i = 1; i < data.length; i++){
DataWrap tem = data[i];
//判断是否有必要插入到前面某个位置,因为当前data[i]前的元素已经有须,
//如果data[i] > data[i-1] 则这次不需要排序,直接当前位置插入。
if(tem.compareTo(data[i-1]) < 0){
int j = i - 1;
//找到合适的位置插入当前data[i]
for(; j >= 0 && tem.compareTo(data[j]) < 0; j--){
data[j+1] = data[j];
}
data[j+1] = tem;
}
}
return data;
}
public static void main(String[] args) {
DataWrap[] data ={new DataWrap(7,""),new DataWrap(2,""),new DataWrap(0,""),
new DataWrap(8,""),new DataWrap(4,""),new DataWrap(2,"*")};
System.out.println("排序之前的元素为:" + Arrays.toString(data));
System.out.println("排序之后的元素为: " + Arrays.toString(insertsort(data)));
}
}
排序后的结果是:
排序之前的元素为:[7, 2, 0, 8, 4, 2*]
排序之后的元素为: [0, 2, 2*, 4, 7, 8]