插入排序的思想:首先假設索引爲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;
}
}
}
}