排序算法-簡單排序


1.冒泡排序

從第一位開始,相鄰的兩個數進行比較。如果前面的數比后面的數大,則兩個數交換位置。排序的過程如下圖所示。

排序的次數為nums.length-1。

第一次排序確定整個數組最后一位,比較了nums.length-1次;

第二次排序是在第一位到倒數第二位的數中確定最后一位,即確定整個數組倒數第二位,比較了nums.length-2次

以此類推,最后一次排序是在第一位到第二位中確定最后一位,即確定整個數組的第二位,比較了1次。

這就是冒泡排序的過程,用代碼展示這個過程如下圖。

可以發現,每次都是for循環的條件表達式有規律的發生改變,優化一下代碼后,冒泡排序的代碼如下

   for(var j=nums.length-1; j>0; j--){
        for(var i=0; i<j; i++){
            if(nums[i]>nums[i+1]){  
                var temp = nums[i+1];
                nums[i+1] =nums[i];
                nums[i] = temp; 
            }
        }
        console.log(nums)
    }


 2.選擇排序

選擇排序與冒泡排序非常相似,冒泡排序是把大的數放在后面,從最后一位往前排序。

選擇排序是將小的數放在前面,從第一位開始往后排序。排序的過程如下圖。

排序的次數為nums.length-1。

第一次排序確定整個數組第一位,比較了nums.length-1次;

第二次排序是在第二位到最后一位的數中確定第一位,即確定整個數組第二位,比較了nums.length-2次

以此類推,最后一次排序是在倒數第二位到最后一位中確定第一位,即確定整個數組的倒數第二位,比較了1次。

這就是選擇排序的過程,用代碼展示這個過程如下圖。

 

可以發現,每次都是for循環的單次表達式和if里面用來確定位數的索引有規律的發生改變,優化一下代碼后,選擇排序的代碼如下

for(j=1; j<nums.length; j++){
    for(var i=j; i<nums.length; i++){
        if(nums[j-1]>nums[i]){
            var temp = nums[j-1];
            nums[j-1] = nums[i];
            nums[i] = temp;
        }
    }
    console.log(nums);
}


 3.插入排序

將整個數組分成有序和無序的兩部分,把無序部分的部分依次插入到有序的部分中。

這個過程類似於斗地主摸牌,首先摸到第一張牌,把第一張牌作為有序部分,而還在牌堆里的牌作為無序部分。

然后摸第二張牌,跟有序部分做比較並插入,第一張牌和第二種牌組成新的有序部分。

依次類推,有序部分不斷擴大,無效部分不斷減少直至沒有,排序的過程如下圖。

排序的次數為nums.length-1。

第一次排序將第二位插入有序部分,前兩位變成有序部分。第二次排序將第三位插入有序部分,前三位變成有序部分。

以此類推,最后一次排序是將最后一位插入有序部分,整體排好了序。

這就是插入排序的過程,用代碼展示這個過程如下圖。

 

 

可以發現,每次都是for循環的單次表達式有規律的發生改變,優化一下代碼后,插入排序的代碼如下

for(j=1; j<nums.length; j++){
    for(i=j; i>0; i--){  
        if(nums[i-1]>nums[i])  
            exchange(i-1,i);  
        else break;
    } 
    console.log(nums);
}


 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM