基礎演算法 二

2021-06-05 10:18:05 字數 1877 閱讀 4585

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。

實現的**如下:

public static void bubblesort(int array) 

}}}

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趟直接選擇排序得到有序結果。

實現的**如下:

public static void selectionsort(int array) 

}if(min != i)

}}

3. 尋找孤立數字

需求:給定乙個陣列,陣列內的數兩兩相同,只有乙個數是孤立的,用最快的方式找出這個數。

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

實現的**如下:        

int array = ;

int single = 0;

for(int i = 0; i < array.length; i++)

} if(issingle)

}

顯然這樣的巢狀迴圈判斷複雜度是很高的,所以使用^,則實現的**如下:

int array = ;

int single = array[0];

for(int i = 1; i < array.length; i++)

乙個for迴圈搞定,不怕做不到,就怕想不到。

4. 進製轉換

將乙個整型資料轉換成二進位制字串。

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

public static string tobinary(int value) 

return build.tostring();

}

高爽|coder

基礎演算法 二

因為整數的長度大於1e5所以利用輸入字串的方式,將大整數從字串轉移到陣列中 進行加減 include include using namespace std vector int add vector int a,vector int b if t c.push back t 加入最高位進製 與加法...

基礎演算法回顧(二)

遞迴 遞迴是呼叫自己的函式 遞迴函式有基線條件和遞迴條件,決定結束和遞迴 遞迴呼叫會產生呼叫棧 棧有壓入和彈出兩種操作 呼叫鏈越長,呼叫棧就會越長,所占用的記憶體就多 尾遞迴可以解決呼叫棧過長的問題。快速排序 快速排序使用了分而治之的方法 分而治之 遞迴式問題解決方法 d c分而治之的原理 1.找出...

二 基礎查詢演算法

有兩種對列表內資料進行查詢的方法,順序查詢和二叉查詢。當資料項在列表內隨機排列的時候可以用順序查詢,當資料在列表內有序排列的時候則會用到二叉查詢。抄點書上原話 助於理解,哈哈。一 順序查詢 最常見的查詢型別就是從記錄集的開始出順次遍歷每條記錄,直到找到所要的記錄或者是達到資料集的末尾,這就是順序查詢...