JS冒泡排序詳細解讀

????????????排序:就是把一個亂序的數(shù)組,通過我們的處理,讓他變成一個有序的數(shù)組

? ? ? ? ? ? 冒泡排序

????????????????==>先遍歷數(shù)組,讓挨著的兩個進行比較,如果前一個比后一個大,那么就把兩個數(shù)據(jù)換個位置

????????????????==>數(shù)組遍歷一遍以后,那么最后一個數(shù)字就是最大的那個了

????????????????==>然后進行第二遍遍歷,還是按照之前的規(guī)則,第二大的數(shù)字就會跑到倒數(shù)第二個位置了

????????????????==>以此類推,最后就會按照順序把數(shù)組排好了

? ? ? ? ?1?先準備一個亂序的數(shù)組

????????var?arr?=?[3,?1,?5,?6,?4,?9,?7,?2,?8];

? ? ? ? ?2?先不急著循環(huán),先來看數(shù)組里面內(nèi)容換個位置,例如換:arr[0]和arr[1]

? ? ? ? var?temp?=?arr[1];

? ? ? ? ?arr[1]?=?arr[0];

? ? ? ? ?arr[0]?=?temp;

????????//?3?第一次遍歷數(shù)組,把最大的放到最后面去

? ? ? ? ?for(var?i=0;i<arr.length-1;i++){

? ? ? ? ? ? ?//每次都是當前一個和后一個比,所以最后一個比較就是:

? ? ? ? ? ? ?//arr[arr.length-2]和arr[arr.length-1]比

? ? ? ? ? ? ?//判斷,如果數(shù)組中的當前一個比后一個大,那么兩個交換一下位置

? ? ? ? ? ? if(arr[i]>arr[i+1]){

? ? ? ? ? ? ? var?temp?=?arr[i];

? ? ? ? ? ? ? ? arr[i]?=?arr[i+1];

? ? ? ? ? ? ? ? arr[i+1]?=temp;

? ? ? ? ? ? ?}

? ? ? ? ?}

????????//第一次結束以后,數(shù)組中的最后一個,就會是最大的那個數(shù)字

????????//4?然后我們把上面的代碼執(zhí)行多次,數(shù)據(jù)有多少項就執(zhí)行多少次

????????for?(var?j?=?0;?j?<?arr.length;?j++)?{

????????????for?(var?i?=?0;?i?<?arr.length?-?1;?i++)?{

????????????????//每次都是當前一個和后一個比,所以最后一個比較就是:

????????????????//arr[arr.length-2]和arr[arr.length-1]比

????????????????//判斷,如果數(shù)組中的當前一個比后一個大,那么兩個交換一下位置

????????????????if?(arr[i]?>?arr[i?+?1])?{

????????????????????var?temp?=?arr[i];

????????????????????arr[i]?=?arr[i?+?1];

????????????????????arr[i?+?1]?=?temp;

????????????????}

????????????}

????????}

????????/*?

????????給一些優(yōu)化

????????????1?想象一個問題,假設數(shù)組長度是9,第八次排完以后,后面8個數(shù)字已經(jīng)按照順序排好了,剩下的那個最小的,一定是在最前面,那么第九次就已經(jīng)沒有意義了,因為最小的已經(jīng)在前面了,不會再有任何換位置出現(xiàn)了

????????????2?第一次的時候,已經(jīng)把最大的數(shù)字放在最后面了, 那么第二次的時候,其實倒數(shù)第二個和倒數(shù)最后一個就不用比了, 因為我們就是要把倒數(shù)第二大的放在倒數(shù)第二的位置,即使比較了, 也不會換位置。第三次就要倒數(shù)第三個數(shù)字就不用再和后兩個比較了。 以此類推,那么其實每次遍歷的時候,就遍歷當前次數(shù)-1

? ? ? ? ? ? ?至此,冒泡排序就完成了

????????*/

????????// 優(yōu)化1以后的結果

? ? ? ? ?for(var?j=0;j<arr.length-1;j++){

? ? ? ? ? ? ?for(var?i=0;i<arr.length-1;i++){

? ? ? ? ? ? ? ? //每次都是當前一個和后一個比,所以最后一個比較就是:

? ? ? ? ? ? ? ? //arr[arr.length-2]和arr[arr.length-1]比

? ? ? ? ? ? ? ? //判斷,如果數(shù)組中的當前一個比后一個大,那么兩個交換一下位置

? ? ? ? ? ? ? ? if(arr[i]>arr[i+1]){

? ? ? ? ? ? ? ? ? ? var?temp?=?arr[i];

? ? ? ? ? ? ? ? ? ? ?arr[i]?=?arr[i+1];

? ? ? ? ? ? ? ? ? ? ?arr[i+1]?=temp;

? ? ? ? ? ? ? ? }

? ? ? ? ? ? ?}

? ? ? ? ?}

????????// 優(yōu)化2以后的結構

? ? ? ? ?for?(var?j?=?0;?j?<?arr.length?-?1;?j++)?{

? ? ? ? ? ? ?for?(var?i?=?0;?i?<?arr.length?-?1?-?j;?i++)?{

? ? ? ? ? ? ? ? ?//每次都是當前一個和后一個比,所以最后一個比較就是:

? ? ? ? ? ? ? ? //arr[arr.length-2]和arr[arr.length-1]比

? ? ? ? ? ? ? ? ?//判斷,如果數(shù)組中的當前一個比后一個大,那么兩個交換一下位置

? ? ? ? ? ? ? ? if?(arr[i]?>?arr[i?+?1])?{

? ? ? ? ? ? ? ? ? ? var?temp?=?arr[i];

? ? ? ? ? ? ? ? ? ? ?arr[i]?=?arr[i?+?1];

? ? ? ? ? ? ? ? ? ? ?arr[i?+?1]?=?temp;

? ? ? ? ? ? ? ? ?}

? ? ? ? ? ? ?}

? ? ? ? ?}

????????//?優(yōu)化3?可能出現(xiàn)還沒完全比較完便已經(jīng)正確

????????var?flag?=?0;? ? ? ?// 統(tǒng)計一共要進行多少次外層for循環(huán)

????????var?arr?=?[3,?1,?5,?6,?4,?9,?7,?2,?8];

????????for?(var?j?=?0;?j?<?arr.length?-?1;?j++)?{

????????????var?count?=?0;? ? ? ?// 統(tǒng)計arr[i] < arr[i+1] 的次數(shù)

????????????for?(var?i?=?0;?i?<?arr.length?-?1?-?j;?i++)?{

????????????????if?(arr[i]?>?arr[i?+?1])?{

????????????????????var?temp?=?arr[i?+?1];

????????????????????arr[i?+?1]?=?arr[i];

????????????????????arr[i]?=?temp;

????????????????}?else?{

????????????????????count++;? ? ?//? ? 每當arr[i] < arr[i+1] 的時候,次數(shù)+1

????????????????}

????????????}

????????????if?(count?==?arr.length?-?1?-?j)?{

????????????????break;? ? ? ?//? ? 當arr[i] < arr[i+1] 的次數(shù) 等于 所有比較次數(shù)的時候,此時排序已經(jīng)完全正確,可直接結束

????????????}

????????????count?=?0;? ? ?//? ? 每次外層for循環(huán)結束都要重置次數(shù)

? ? ? ? ? ? flag++;? ? //? 每進行一次外層for循環(huán),便記錄1次(放在外層for循環(huán)的末尾時,則不會加上最后一次外層for循環(huán)檢測到完全正確時的情況)

????????}

????????console.log(arr);

????????console.log(flag);

?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

友情鏈接更多精彩內(nèi)容