打卡第九天查詢:順序查詢、二分查詢、雜湊表查詢、二叉排序查詢快速排序==》 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...