演算法和資料操作
重要的演算法:二分查詢、歸併排序和快速排序。查詢一般分為順序查詢、二分查詢、雜湊表查詢和二叉排序樹查詢。排序包括:選擇排序、插入排序、交換排序、歸併排序以及外排序等。
快速排序
實現快速排序演算法的關鍵在於先在陣列中選擇乙個數字,接下來把陣列中的數字分為兩部分,比選擇的數字小的數字移到陣列的左邊,比選擇的數字大的數字移到陣列的右邊。
int partition(int data, int length, int start, int end)
int index = randominrange(start, end);
swap(&data[index], &data[end]);
int small = start - 1;
for(index = start; index < end; ++index)
} ++small;
swap(&data[small], &data[end]);
return small;
}void quicksort(int data, int length, int start, int end)
快速排序總體平均效率是最好的,但不是任何時候都是最優的演算法。比如陣列本身已經排好序了,而每一輪排序的時候都是以最後乙個數字作為比較的標準,此時快速排序的效率只有o(
n^2)。
8.(旋轉陣列的最小數字)把乙個陣列最開始的若干個元素搬到陣列的末尾,我們稱之為陣列的旋轉,輸出旋轉陣列的最小元素。例如陣列
為的乙個旋轉,該陣列的最小元素為1.
3 4
5 1
2 p1 p2
3 4
5 1
2 p1 p2
3 4
5 1
2 p1 p2
(a)把
p1指向陣列的第乙個數字,
p2指向陣列的最後乙個數字。由於p1和
p2中間的數字5大於
p1指向的數字,中間的數字在第乙個子陣列中。下一步把
p1指向中間的數字。(b)
p1和p2中間的數字1小於
p2指向的數字,中間的數字在第二個子陣列中。下一步把
p2指向中間的數字。(c)
p1和p2指向兩個相鄰的數字,則
p2指向的是陣列中的最小的數字。
int min(int *numbers, int length)
int index1 = 0;
int index2 = length - 1;
int indexmid = index1;
while(numbers[index1] >= numbers[index2])
indexmid = (index1 + index2) / 2;
if(numbers[indexmid] >= numbers[index1])
index1 = indexmid;
else if(numbers[indexmid] <= numbers[index2])
return numbers[indexmid];
}}
特殊情況:index1和
index2
下標對應的兩個數相同的情況。 1
0 11 1
p1 p2 或
1 11 0
1 p1
p2
陣列的兩個旋轉和
解決方法:順序查詢
int min(int *numbers, int length)
int index1 = 0;
int index2 = length - 1;
int indexmid = index1;
while(numbers[index1] >= numbers[index2])
indexmid = (index1 + index2) / 2;
//如果下標index1、index2和indexmid指向的三個數字相等
//則只能順序查詢
if(numbers[index1] == numbers[index2] && numbers[indexmid] == numbers[index1])
return mininorder(numbers, index1, index2);
if(numbers[indexmid] >= numbers[index1])
index1 = indexmid;
else if(numbers[indexmid] <= numbers[index2])
return numbers[indexmid]; }}
int mininorder(int *numbers, int index1, int index2)
return result;
}
測試用例:
(1)功能測試(輸入的陣列是公升序排序陣列的乙個旋轉,陣列中有重複的數字或者沒有重複數字)。
(2)邊界值測試(輸入的陣列是乙個公升序排序的陣列、只包含乙個數字的陣列)。
(3)特殊輸入測試(輸入
null
指標)。
演算法和資料結構
演算法和資料結構 演算法和資料結構 千絲萬縷的聯絡 縱觀各種演算法書籍,大多都是將演算法和資料結構作為乙個整體來講述。資料結構就是陣列 樹結構等儲存或表現物件資料的結構。將演算法和資料結構作為整體講述,是因為必須依照演算法中的常用操作選擇資料結構。例如,事先將資料儲存在適當的樹形結構中,大多數情況下...
演算法和資料結構
演算法 資料結構與演算法的關係是相互依賴不可分割的。演算法的定義 演算法是解決特定問題求解步驟的描述,在計算機中為指令的有限序列,並且每條指令表示乙個或多個操作。演算法的特性 有窮性 確定性 可行性 輸入 輸出。演算法設計的要求 正確性 可讀性 健壯性 高效率和低儲存量需求。演算法特性與演算法設計容...
演算法和資料結構
好吧,在這裡,您被優秀或優秀的軟體開發人員所隔開。在這種情況下,我會告訴您,一開始或至少在我的情況下,我知道大多數時候,對於我認識的大多數人,您會覺得自己是乙個無能的人或白痴。基本上,我怎麼可能不理解這一點,然後您會感到沮喪。在這種情況下,我會告訴您情況並不像您想的那麼糟糕,您會告訴我 您知道,您甚...