原地算法:是一種使用小的,固定數量的額外之空間來轉換資料的算法。當算法執行時,輸入的資料通常會被要輸出的部份覆蓋掉。
范例:冒泡排序、選擇排序、插入排序、希爾排序
(1)冒泡排序:
冒泡排序算法的原理如下:
比較相鄰的元素。如果第一個比第二個大,就交換他們兩個。
對每一對相鄰元素做同樣的工作,從開始第一對到結尾的最后一對。在這一點,最后的元素應該會是最大的數。
針對所有的元素重復以上的步驟,除了最后一個。
持續每次對越來越少的元素重復上面的步驟,直到沒有任何一對數字需要比較
冒泡排序OC代碼如下: for (int i = 0; i<result.count; i++) { for (int j = 0; j<result.count-1-i; j++) { NSInteger left = [result[j] integerValue]; NSInteger right = [result[j+1] integerValue]; if (left<right) { [result exchangeObjectAtIndex:j withObjectAtIndex:j+1]; } } } NSLog(@"%@",result);
(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個的新無序區
選擇排序的OC代碼如下: NSMutableArray *sortArray = [NSMutableArray arrayWithObjects:@"3", @"8", @"1", @"5", nil]; for (NSInteger i = 0; i < sortArray.count; i++) { NSInteger k = i; for (NSInteger j = i + 1; j < sortArray.count; j++) { //這一步我做錯了,我的初始條件是 j = i, 沒有考慮到,第一個元素 跟第二個元素對比就可以了,沒有必要每次都第一個跟第一個開始對比 NSInteger jValue = [sortArray[j] integerValue]; NSInteger kValue = [sortArray[k] integerValue]; if (jValue < kValue) { k = j; } } [sortArray exchangeObjectAtIndex:i withObjectAtIndex:k]; } NSLog(@"--%@---", sortArray);
(3)插入排序--穩定排序
插入排序算法的原理: 算法設計有很多方法。插入排序使用的是增量(incremental)方法;在排好子數組A[1..j-1]后,將A[j]插入,形成排好序的子數組A[1..j]; 步驟 ⒈從有序數列和無序數列{a2,a3,…,an}開始進行排序; ⒉處理第i個元素時(i=2,3,…,n),數列{a1,a2,…,ai-1}是已有序的,而數列{ai,ai+1,…,an}是無序的。用ai與ai-1,a i-2,…,a1進行比較,找出合適的位置將ai插入; ⒊重復第二步,共進行n-i次插入處理,數列全部有序。 思路 假定這個數組的序是排好的,然后從頭往后,如果有數比當前外層元素的值大,則將這個數的位置往后挪,直到當前外層元素的值大於或等於它前面的位置為止.這具算法在排完前k個數之后,可以保證a[1…k]是局部有序的,保證了插入過程的正確性.
插入排序算法的OC代碼如下: NSMutableArray *sortArray = [NSMutableArray arrayWithObjects:@"3", @"8", @"1", @"5", @"9", @"2", nil]; for (NSInteger i = 1; i < sortArray.count; i++) {
//從第一個開始跟第0個比較,所以 i= 1 if (sortArray.count <2) { break; } for (NSInteger j = i; j > 0; j--) { NSInteger rightV = [sortArray[j] integerValue]; NSInteger leftV = [sortArray[j - 1] integerValue]; if (rightV < leftV) { [sortArray exchangeObjectAtIndex:j withObjectAtIndex:j -1]; }else { break; } } } NSLog(@"--%@---", sortArray);