天天看點

基礎算法(二)

        上一篇:基礎算法(一)

        1. 冒泡排序(BubbleSort)

        原理:依次比較相鄰的兩個數,将小數放在前面,大數放在後面。即在第一趟:首先比較第1個和第2個數,将小數放前,大數放後。然後比較第2個數和第3個數,将小數放前,大數放後,如此繼續,直至比較最後兩個數,将小數放前,大數放後。至此第一趟結束,将最大的數放到了最後。在第二趟:仍從第一對數開始比較(因為可能由于第2個數和第3個數的交換,使得第1個數不再小于第2個數),将小數放前,大數放後,一直比較到倒數第二個數(倒數第一的位置上已經是最大的),第二趟結束,在倒數第二的位置上得到一個新的最大數(其實在整個數列中是第二大的數)。如此下去,重複以上過程,直至最終完成排序。

  由于在排序過程中總是小數往前放,大數往後放,相當于氣泡往上升,是以稱作冒泡排序。

  用二重循環實作,外循環變量設為i,内循環變量設為j。外循環重複9次,内循環依次重複9,8,...,1次。每次進行比較的兩個元素都是與内循環j有關的,它們可以分别用a[j]和a[j+1]辨別,i的值依次為1,2,...,9,對于每一個i,j的值依次為1,2,...10-i。

        實作的代碼如下:

2. 選擇排序

        原理:n個數的直接選擇排序可經過n-1趟直接選擇排序得到有序結果:

        ①初始狀态:無序區為R[1..n],有序區為空。

        ②第1趟排序,在無序區R[1..n]中選出關鍵字最小的記錄R[k],将它與無序區的第1個記錄R[1]交換,使R[1..1]和R[2..n]分别變為記錄個數增加1個的新有序區和記錄個數減少1個的新無序區。

        ……

        ③第i趟排序,第i趟排序開始時,目前有序區和無序區分别為R[1..i-1]和R(i..n)。該趟排序從目前無序區中選出關鍵字最小的記錄R[k],将它與無序區的第1個記錄R交換,使R[1..i]和R分别變為記錄個數增加1個的新有序區和記錄個數減少1個的新無序區。

        這樣,n個數的直接選擇排序可經過n-1趟直接選擇排序得到有序結果。

3. 尋找孤立數字

        需求:給定一個數組,數組内的數兩兩相同,隻有一個數是孤立的,用最快的方式找出這個數。

        分析:循環數組,判斷第i個元素的值和其它位置的值是否相等,如果不存在相等的,那麼這個數就是孤立資料。

        實作的代碼如下:        

        顯然這樣的嵌套循環判斷複雜度是很高的,是以使用^,則實作的代碼如下:

        一個for循環搞定,不怕做不到,就怕想不到。

4. 進制轉換

        将一個整型資料轉換成二進制字元串。

        分析:整型一共32位,最高位代表正負,那麼得到第i位的數隻需要将整數右移i-1位,實作的代碼如下;