資料結構 演算法和資料操作

2021-08-07 02:12:56 字數 2656 閱讀 7134

演算法和資料操作

重要的演算法:二分查詢、歸併排序和快速排序。查詢一般分為順序查詢、二分查詢、雜湊表查詢和二叉排序樹查詢。排序包括:選擇排序、插入排序、交換排序、歸併排序以及外排序等。

快速排序

實現快速排序演算法的關鍵在於先在陣列中選擇乙個數字,接下來把陣列中的數字分為兩部分,比選擇的數字小的數字移到陣列的左邊,比選擇的數字大的數字移到陣列的右邊。

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

指標)。

演算法和資料結構

演算法和資料結構 演算法和資料結構 千絲萬縷的聯絡 縱觀各種演算法書籍,大多都是將演算法和資料結構作為乙個整體來講述。資料結構就是陣列 樹結構等儲存或表現物件資料的結構。將演算法和資料結構作為整體講述,是因為必須依照演算法中的常用操作選擇資料結構。例如,事先將資料儲存在適當的樹形結構中,大多數情況下...

演算法和資料結構

演算法 資料結構與演算法的關係是相互依賴不可分割的。演算法的定義 演算法是解決特定問題求解步驟的描述,在計算機中為指令的有限序列,並且每條指令表示乙個或多個操作。演算法的特性 有窮性 確定性 可行性 輸入 輸出。演算法設計的要求 正確性 可讀性 健壯性 高效率和低儲存量需求。演算法特性與演算法設計容...

演算法和資料結構

好吧,在這裡,您被優秀或優秀的軟體開發人員所隔開。在這種情況下,我會告訴您,一開始或至少在我的情況下,我知道大多數時候,對於我認識的大多數人,您會覺得自己是乙個無能的人或白痴。基本上,我怎麼可能不理解這一點,然後您會感到沮喪。在這種情況下,我會告訴您情況並不像您想的那麼糟糕,您會告訴我 您知道,您甚...