1.冒泡排序
從第一位開始,相鄰的兩個數進行比較。如果前面的數比后面的數大,則兩個數交換位置。排序的過程如下圖所示。
排序的次數為nums.length-1。
第一次排序確定整個數組最后一位,比較了nums.length-1次;
第二次排序是在第一位到倒數第二位的數中確定最后一位,即確定整個數組倒數第二位,比較了nums.length-2次
以此類推,最后一次排序是在第一位到第二位中確定最后一位,即確定整個數組的第二位,比較了1次。
這就是冒泡排序的過程,用代碼展示這個過程如下圖。
可以發現,每次都是for循環的條件表達式有規律的發生改變,優化一下代碼后,冒泡排序的代碼如下
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); }