插入排序汇总

 

package sorting;

/*******************************************************************************
* 插入排序算法汇总
*
* 性能评价:排序算法的时间复杂度由算法执行中的元素比较次数和移动次数决定
*
*
*****************************************************************************
*/

public class insertion_sort {

// 直接插入排序(升序)
//测试结果为50000个数排序,用时约2766毫秒(惠普CQ45笔记本,酷睿P7350,内存2G)
public static void straight_insertion_sort(int[] data) {

long timestart = System.currentTimeMillis();
// 进行N-1趟扫描,就是除了原序列中的第一个数之外其他数都要和前面比较一下
for (int i = 1; i < data.length; i++) {
// 内循环,用于找到合适的位置并执行插入
// 先得到待比较的元素,拿这个元素和前面的已经排好的序列从后向前一一比较
// 直到找到比这个待比较元素小的元素位置为止,则这个小的元素的后面一个位置就是
// 合适的插入位置
int temp = data[i];
int j = 0; // 用来实现内部的循环比较
// 待比较元素小于比较的元素才将大的元素后移一位,直到j=0也就是和前面的所有都比较完了以后跳出循环
for (j = i - 1; j > -1 && temp < data[j]; j--) {
data[j + 1] = data[j]; // 将大的元素后移,空出前面的位置,以便插入
}
// 将元素插入到正确位置,正确的位置就是j+1位置
data
[j + 1] = temp;
}
long timeend = System.currentTimeMillis();
DataHelper.showruntime(timestart, timeend); //计算排序时间
System.out.
print("\n\n最后排序结果为:");
DataHelper.showdata(data);

}



//希尔排序(缩小增量排序)
//其基本的思想是分组的直接插入排序
//测试结果为8000000个随机数排序时间为3547毫秒左右(惠普CQ45笔记本,酷睿P7350,内存2G)
public static void shell_sort(int[] data)
{
long timestart=System.currentTimeMillis();
//控制增量,进行若干趟扫描.增量有很多种变化方法,这里用的是每趟增量减一半。
//增量就是每趟比较的时候待比较元素比较跨的幅度,不是一个一个向前比了而是以delta增量向前比较,当delta增量
//逐渐缩小变为1时就是直接插入排序了(所有的元素放在一组进行排序)。所以直接插入排序可以看成是delta为1时的希尔排序

//希尔排序共有三层循环: 第一层控制增量的变化,主要是让其逐渐减小直到变为1
// 第二层根据增量分组。每组的特点是元素的间隔为增量大小,组的数量为增量delta大小
// 第三层在每组内进行直接插入排序

//希尔排序比直接插入排序快的原因:因为直接插入排序在越接近有序的情况下效率越高,所以希尔排序就是先利用小组排序先
// 将序列接近有序,然后再直接排序
for(int delta=data.length/2;delta>0;delta/=2)
{
//一趟中若干组,每个元素在自己组内进行直接插入排序
for(int i=delta;i<data.length;i++)
{
int temp=data[i];
int j=i-delta;
while(j>=0&&temp<data[j])
{
data
[j+delta]=data[j];
j
-=delta;
}
data
[j+delta]=temp;
}
}
long timeend=System.currentTimeMillis();
DataHelper.showruntime(timestart, timeend); //显示排序时间
DataHelper.showdata(data); //显示排序后的结果
}

}
posted @ 2010-01-04 13:30  qianlifeng  阅读(308)  评论(0编辑  收藏  举报