資料結構與演算法(九) 查詢與排序

2021-08-20 01:45:45 字數 3420 閱讀 7461

打卡第九天

快速排序==》 c++異常處理沒有搞定(lll¬ω¬)

排序陣列本身就是陣列旋轉的乙個特例。

在對陣列進行排序或查詢時,要注意陣列中有相同數字的特例,比如下面的旋轉陣列的時候

查詢:順序查詢、二分查詢、雜湊表查詢、二叉排序查詢

排序:插入排序、氣泡排序、歸併排序、快速排序

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

突然就卡在快速排序了,自己都有點懵了,因為之前用python實現的時候是使用了乙個新的陣列,這一次要在原來的陣列裡面不使用新的空間進行劃分,直接看圖吧

選擇的用於進行標誌的是每個陣列的最後乙個數data[end]=5。第一輪for迴圈,small=-1,因為4<5,所以這一輪的small可以加1,small表示的是最新的比flag小的數的位置,又因為small已經指向當前的位置了,所以就不用進行交換了;第二輪同理;第三輪的時候,由於8>5,所以small不用改變,最新的small還是上一輪的3;第四輪的時候,1<5,所以這一輪的small應該指向的是1,所以small+1,之後還要把small現在指向的位置的數的值和1進行交換;後面以此類推……

//快速排序演算法

//交換兩個數的值

void swap(int

*x, int

*y)int partition(int data, int

length, int start, int end)

}//最後還要將最後乙個數放到前面,和其他小的數放到一起

++small;

swap(&flag, &data[small]);

return small; //返回的是最後乙個較小的數的位置,即大數與小數劃分處

}void quicksort(int data, int

length, int start, int end)

不是很懂c++的異常處理問題,這個**存在問題,關於異常處理的,所以沒有用測試用例執行。。。之後要是弄懂了會回來看的

如下圖,奇怪的是我這不是對這個異常進行處理了嗎?懇請各位路過的朋友能解個疑[/抱拳]【問題說明:這是在函式裡面try-catch的,之後有試過在呼叫該函式的地方try-catch也不行】

為員工年齡進行排序,要求時間複雜度在o(n)內,允許使用常數範圍內輔助空間,不得大於o(n)

使用統計的方法,先對員工的年齡進行統計,用乙個陣列儲存某一年齡出現的次數times,之後在返回的ages陣列中填入times次該年齡出現的次數。

//給員工年齡進行排序

void sortages(int ages, int length)

intindex = 0;

for (int i = 0; i <= oldestage; i++)}}

把乙個陣列最開始的若干個元素搬到陣列的末尾,我們稱之為陣列的旋轉。輸入乙個遞增排序的陣列的乙個旋轉,輸出旋轉陣列的最小元素。例如,陣列為的乙個旋轉,該陣列的最小值為1.

1、旋轉之後的陣列實際上可以劃分為兩個排序的子陣列,而且前面子陣列的元素都大於或等於後面子陣列的元素。最小的元素剛好是兩個子陣列的分界線。這道題可以說是部分排序的,在一開始就有提到部分排序的陣列的查詢可以使用二分查詢法

2、第乙個元素大於或等於最後乙個元素。找到中間的元素,如果該中間元素位於前面的遞增子陣列,那麼它應該大於或等於第乙個指標指向的元素。此時陣列中最小的元素應該在該中間元素的後面。可以把第乙個指標指向該中間元素,縮小查詢範圍。移動後第乙個指標仍然指向第乙個子陣列的元素。

3、第乙個指標總是指向第乙個子陣列的元素,第二個指標總是指向第二個子陣列的元素。最終第乙個指標會指向第乙個子陣列的最後乙個元素,第二個指標會指向第二個子陣列的第乙個元素。此時,第二個指標指向的正好是最小的元素,這就是迴圈結束的條件

int min(int

array, int length)

indexmiddle = (index1 + index2) / 2;

//如果middle在前面的子陣列中

if (array[indexmiddle] >= array[index1])

index1 = indexmiddle;

//如果middle在後面的子陣列中,往前移後面的指標,縮小查詢範圍

else

if (array[indexmiddle] <= array[index2])

index2 = indexmiddle;

}return

array[indexmiddle];

}

一種特殊的情況:陣列和陣列都是排序陣列的旋轉陣列。在這兩陣列中,第乙個數字、中間的數字、最後乙個數字都是1,無法判斷中間的1是前面的子陣列的還是後面的子陣列的。很混亂,比如前面的例子,中間的1是位於後面的子陣列;第二個例子,中間的1是位於後面的子陣列。這樣就不得不採用順序查詢的方法了。

//順序查詢

int mininorder(int

array, int index1, int index2)

return result;

}int minchoose(int

array, int length)

indexmiddle = (index1 + index2) / 2;

//修改的地方:

//如果下標為index1,indexmiddle,index2的三個元素的值都相等,只能用順序查詢

if (array[index1] == array[index2] && array[index2] == array[indexmiddle])

return mininorder(array, index1, index2);

//如果middle在前面的子陣列中

if (array[indexmiddle] >= array[index1])

index1 = indexmiddle;

//如果middle在後面的子陣列中,往前移後面的指標,縮小查詢範圍

else

if (array[indexmiddle] <= array[index2])

index2 = indexmiddle;

}return

array[indexmiddle];

}

資料結構與演算法(九) 查詢

查詢是在大量的資訊中尋找乙個特定的資訊元素,在計算機應用中,查詢是常用的基本運算,例如編譯程式中符號表的查詢。定義 根據給定的某個值,在查詢表中確定乙個其關鍵字等於給定值的資料元素 或記錄 分類 靜態查詢和動態查詢 無序查詢和有序查詢。遍歷陣列並且依次對比值,相等時返回下標 在給定陣列中線性查詢指定...

資料結構與演算法 查詢與排序

參考 線性查詢 二分查詢 氣泡排序 插入排序 選擇排序 快速排序 歸併排序 逐個查詢要查詢的物件 include typedef char datatype int mysearch datatype ts,int n,const datatype d int main printf d n mys...

資料結構與演算法 九 希爾排序

演算法思想 希爾排序是基於插入排序的以下兩點性質而提出改進方法的 先取乙個小於n的整數d1作為第乙個增量,把檔案的全部記錄分組。所有距離為d1的倍數的記錄放在同乙個組中。先在各組內進行直接插入排序 然後,取第二個增量d2key a main.c include include include sor...