经典排序算法(二)--插入排序、希尔排序(Java实现)

插入排序的思想:首先假设索引为0的元素]被正确排序,然后只需要对索引为1-nums.length-1的元素排序,每次将要插入的元素赋值给变量target,然后判断target与已经排好序的元素相比较,如果target小于排好序的元素,说明target要插入到这个元素的前面,那么将此元素向后移动一位,即nums[j] = nums[j-1],将nums[j-1]赋值给nums[j],这样一直比较直到target>=nums[j-1],把target赋值给nums[j]即可,相当于把索引为i的元素插入到了索引为j处,j后面的元素都向后移动一位。代码如下:

int len = nums.length;
    	int i,j;
    	int target;
    	for(i=0;i<len;i++){
    		j=i;
    		target = nums[i];
    		while(j>0&&target<nums[j-1]){
    			nums[j] = nums[j-1];
    			j--;
    		}
    		nums[j] = target;

希尔排序:希尔排序是缩小增量排序,是插入排序的一种,首先将待排序的元素分为若干子序列,这些子序列中的元素由相隔gap(即增量)的元素组成,对子序列进行插入排序,然后再减小增量,并且随着增量的减小,序列基本有序,当增量足够小时,再对所有元素进行插入排序,当序列基本有序时,插入排序的效率高。但是这种排序算法不稳定,如果待排序的序列中存在相同元素时,如果它们被划分到不同子序列,那么相同元素可能会在各自子序列的插入排序中移动,最后稳定性会被打乱。

int len = nums.length;
    	int gap;
    	for(gap=len/2;gap>0;gap/=2){
    		for(int i=0;i<gap;i++){
    			for(int j=i+gap;j<len;j+=gap){
    				if(nums[j]<nums[j-gap]){
    					int k = j-gap;
    					int tmp = nums[j];
    					
    					while(k>=0&&tmp<nums[k]){
    						nums[k+gap] = nums[k];
    						k-=gap;
    					}
    					nums[k+gap] = tmp;
    				}
    			}
    		}
    	}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章