????????????排序:就是把一個亂序的數(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);