1. 程式人生 > >常用算法(二)選擇排序與冒泡排序

常用算法(二)選擇排序與冒泡排序

true .com sele mage ever 最終 不穩定排序 換來 ima

一、選擇排序

簡單選擇排序是最簡單直觀的一種算法,基本思想為每一趟從待排序的數據元素中選擇最小(或最大)的一個元素作為首元素,直到所有元素排完為止,簡單選擇排序是不穩定排序。

在算法實現時,每一趟確定最小元素的時候會通過不斷地比較交換來使得首位置為當前最小,交換是個比較耗時的操作。其實我們很容易發現,在還未完全確定當前最小元素之前,這些交換都是無意義的。我們可以通過設置一個變量min,每一次比較僅存儲較小元素的數組下標,當輪循環結束之後,那這個變量存儲的就是當前最小元素的下標,此時再執行交換操作即可

技術分享圖片

def selectSort[T](comparator:(T,T)=>Boolean)(source:ListBuffer[T]):ListBuffer[T]={
    for(i<-source.indices){
      var min=source(i)
      var index=i
      for(j<-i+1 until source.length){
        if(comparator(min,source(j))){
          min=source(j)
          index=j
        }
      }
      source(index)=source(i)
      source(i)=min
    }
    source
  }

二、冒泡排序

冒泡排序的基本思想是,對相鄰的元素進行兩兩比較,順序相反則進行交換,這樣,每一趟會將最小或最大的元素“浮”到頂端,最終達到完全有序

技術分享圖片

def bubbleSort[T](source:ListBuffer[T])(implicit t:T=>Ordered[T]):ListBuffer[T]= {
    for (i <- source.indices.reverse) {
      for (j <- ((source.length - i + 1) until source.length).reverse) {
        val current = source(j)
        val prev = source(j - 1)
        if (current < prev) {
          source(j - 1) = current
          source(j) = prev
        }
      }
    }
    source
  }

這兩種排序算法的時間復雜度均為O(n2)  

常用算法(二)選擇排序與冒泡排序