程序员必备排序之插入排序、希尔排序

由于最近要找实习单位便在刷算法题,发现许多算法题都涉及到排序的知识所以今天把排序的内容总结一遍备忘。博客中的内容大部分是参考《王道数据结构》

内部排序分为几类分别为:插入排序(直接插入排序、希尔排序),交换排序(冒泡排序、快速排序),选择排序(简单选择排序、堆排序),归并排序和基数排序。

各大排序的比较如下图所示:

程序员必备排序之插入排序、希尔排序_第1张图片


一、插入排序

1.1直接插入排序

1、思想:基本思想在于每次将一个待排序的记录,按其关键字大小插入到前面已经排好序的子序列中,直到全部记录插入完成。
2、代码实现
package sort;
public class insertSort {
	public insertSort(int[] a){
		int temp = 0;
		for(int i=1;i=0&&a[j]>temp;j--){
				a[j+1]=a[j];
			}
			a[j+1]  = temp;			//此时的j+1表示为待插入数字的位置
		}
	}
	private void print(int[] a){
		for(int i=0;i

1.2折半插入排序

1、思想:直接插入排序的过程分俩步,从前面表中查找待插入数据的位置、给插入位置腾出控件插入待插入的元素。折半插入排序即是在第一步上有所改进使用折半查找来寻找待插入数据的位置。
2、代码实现:
package sort;
public class insertSort2 {
	public insertSort2(int[] a){
		int temp=0,low,high,mid;
		for(int i=1;ia[mid])		low=mid+1;
				else	high=mid-1;
			}
			for(j=i-1;j>=high+1;j--){
				a[j+1]=a[j];
			}
			a[j+1]=temp;
		}
	}
	private void print(int[] a){
		for(int i=0;i
从上述算法中不难看出折半插入排序仅仅是减少了比较元素的次数而比较次数与待排序的初始状态无关,仅取决于表中的元素的个数,故折半插入排序的时间复杂度仍为O(n^2)。

1.3希尔排序(缩小增量排序)

1、思想:先将待排序表分割为若干个形如L[i,i+d,i+2d,i+3d,...i+kd]的“特殊”的子表,分别进行插入排序,当整个子表已“基本有序”时,再对全体记录进行一次直接插入排序
2、代码实现:
package sort;
public class shellSort {
	public shellSort(int[] a){
		double d = a.length;
		while(true){
			d = Math.ceil(d/2.0);
			int dm = (int)d;
			int temp = 0;
			for(int n=0;n=0&&a[j]>temp;j-=dm){
					a[j+dm] = a[j]; 
				}
				a[j+dm] = temp;
			}
			}
			if(dm==1)	return ;	    //进行了增量为1的排序后跳出循环
		}
	}
	private void print(int[] a){
		for(int i=0;i


你可能感兴趣的:(数据结构算法)