經典排序算法(二)--插入排序、希爾排序(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;
    				}
    			}
    		}
    	}


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