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

2021-08-20 01:32:57 字數 4516 閱讀 1477

參考:

線性查詢

二分查詢

氣泡排序

插入排序

選擇排序

快速排序

歸併排序

##逐個查詢要查詢的物件

#include typedef char datatype;

int mysearch(datatype *ts, int n, const datatype d)

int main()

; printf("%d\n", mysearch(cs, 6, '*'));

printf("%d\n", mysearch(cs, 6, 'a'));

printf("%d\n", mysearch(cs, 6, 'd'));

printf("%d\n", mysearch(cs, 6, 'c'));

}

二分查詢演算法,又稱折半搜尋、二分搜尋,是一種在有序陣列中查詢某一特定元素的搜尋演算法。

二分查詢演算法的查詢過程是這樣的。首先,要求待查詢的陣列是排好序的陣列,我們假設陣列是公升序的,即從小到大排序。然後,將要查詢的元素與陣列的中間元素相對比,如果相等,則表示要查詢的元素被找到了,並停止查詢;如果要查詢的元素小於陣列的中間元素,則從陣列中間元素開始到陣列最後的元素都大於要查詢的元素,也就不需要在其中查詢了,只需要在陣列中間元素到陣列第乙個元素之間查詢;如果要查詢的元素大於陣列的中間元素,則從陣列中間元素到陣列第乙個元素都小於要查詢的元素,也就不需要在其中查詢了,只需要在陣列中間元素到陣列最後的元素之間查詢。二分查詢演算法在查詢的過程中只需對比一次,就可以使待查詢的物件個數減少一半。查詢速度非常快,所以二分查詢演算法得到了廣泛的應用。

步驟一:定義上下界

步驟二:確定中間點

步驟三:重新確定查詢範圍

步驟四:按新範圍重新查詢

typedef char datatype;

int mysearch(datatype *ts, int n, const datatype d)

return -1;

}int main()

; printf("%d\n", mysearch(cs, 6, '*'));

printf("%d\n", mysearch(cs, 6, 'a'));

printf("%d\n", mysearch(cs, 6, 'd'));

printf("%d\n", mysearch(cs, 6, 'c'));

}

氣泡排序是一種著名的排序方法。

氣泡排序的過程是這樣的,首先,將待排序的陣列中的第乙個元素與第二個元素相對比,如果這兩個元素的大小順序不是我們要求的順序,則將它們交換過來。然後,將待排序的陣列中的第二個元素與第三個元素相對比,如果這兩個元素的大小順序也不是我們要求的順序,則也將它們交換過來。下一步,是對比第三個元素與第四個元素,直至倒數第二個元素與最後乙個元素相對比。這樣一趟對比下來,小的資料元素會一點一點的往前放,而大的資料元素會一點一點的往後放。反覆多趟的這樣對比,直到所有資料都排好序為止。

步驟一:第一趟比較

步驟二:多趟比較,直至排好序

步驟三:設定標誌,提高效率--定義乙個布林型變數,初始化為真,為真代表陣列已經排好序了

typedef int datatype;

void bubble(datatype* a, int n)

}if (flag) break;

}}void print(datatype* a, int n)

int main() ;

bubble(a, 10);

print(a, 10);

return 0;

}

插入排序演算法是一種簡單直觀的排序演算法。

插入排序的過程是這樣的,首先,將待排序的陣列分成兩部分,一部分是已經排好序的部分,另一部分是未排好序的部分。在開始排序前,已排好序的部分只有乙個陣列元素,即陣列的第乙個元素;未排好序的部分是陣列中除第乙個元素外的其它所有元素。然後,將未排好序部分中的第乙個陣列元素,插入到已排序部分當中適當的位置,以保證已排序部分仍然是保持排序狀態。此時,已排序部分就變成兩個陣列元素,而未排序部分的陣列元素同時少了乙個。依次類推,逐個從未排好序的部分拿出乙個元素,插入到已排序部分當中適當的位置,直至陣列按順序排好為止。

步驟一:將未排序部分的第乙個元素插入到已排序部分

步驟二:將所有未排序部分的元素插入到已排序部分

typedef int datatype;

void insert(datatype *a, int n)

a[j] = t;

}}void print(datatype* a, int n)

int main() ;

insert(a, 10);

print(a, 10);

return 0;

}

選擇排序是一種簡單直觀的排序方法。

選擇排序的過程是這樣的,首先,在待排序的陣列中找到乙個最小的陣列元素,將該最小陣列元素與陣列的第乙個元素進行交換,這樣交換之後,陣列的第乙個元素就變成了陣列元素中的最小值。然後,再在待排序陣列的剩餘元素中找到乙個最小的陣列元素,將該最小陣列元素與陣列的第二個元素進行交換,這樣交換之後,陣列的第二個元素就變成了陣列元素中的第二小的值。依次類推,直至陣列按順序排好為止。

步驟一:尋找陣列中指定範圍內的最小元素

步驟二:將最小元素與陣列第乙個位置的元素交換

步驟三:將陣列剩餘元素排序

typedef int datatype;

void selects(datatype *a, int n)

}if (k != i)

}}void print(datatype* a, int n)

int main() ;

selects(a, 10);

print(a, 10);

return 0;

}

快速排序演算法是一種基於交換的排序,系統地交換反序的記錄的偶對,直到不再有這樣一來的偶對為止。它是對氣泡排序的一種改進。

快速排序的過程是這樣的。首先,將待排序的陣列從前向後和從後向前各取出乙個元素進行對比交換,從而將待排序的陣列分成兩個部分,前一部分的所有元素都小於後一部分的所有元素,但前後兩部分內部仍然是無序的狀態。然後再將前一部分的所有元素從前向後和從後向前各取出乙個元素進行對比交換,從而將前一部分的所有元素再分成兩個部分,這兩部分的前一部分的所有元素都小於後一部分的所有元素,依次類推,直到被分割的部分只有乙個元素為止。下一步,再將後一部分的所有元素從前向後和從後向前各取出乙個元素進行對比交換並分成兩個部分。這樣分到最後,陣列將排好序。

步驟一:終止分組條件

步驟二:將陣列分成兩部分

步驟三:遞迴分組

typedef int datatype;

void qsorts(datatype *a, int n)

//繼續左邊分組

qsorts(a, l);

//繼續右邊分組

qsorts(a + l + 1, n - l - 1);

}void print(datatype* a, int n)

int main() ;

qsorts(a, 10);

print(a, 10);

return 0;

}

歸併排序是將兩個已經排好序的序列合併成乙個序列的操作。

歸併排序的過程是這樣的。首先,將待排序的陣列中的元素從中間分為前後兩部分。然後再將前一部分繼續分成兩部份,後一部分也繼續分成兩部分,依次類推,直到單個元素為止。最後兩兩按序合併,直到整個陣列合併成乙個有序陣列為止。

步驟一:將陣列分成前後兩部分

步驟二:將前後兩部分重新按序合併

#include#include#define size 8

void merge(int sourcearr,int startindex,int midindex,int endindex)

//內部使用遞迴

void mergesort(int sourcearr,int startindex,int endindex)

}//呼叫

int main(int argc,char * argv)

; mergesort(a,0,size-1);

for(int i=0;iprintf("%d ",a[i]);

printf("\n");

return 0;

}

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

打卡第九天 快速排序 c 異常處理沒有搞定 lll 排序陣列本身就是陣列旋轉的乙個特例。在對陣列進行排序或查詢時,要注意陣列中有相同數字的特例,比如下面的旋轉陣列的時候 查詢 順序查詢 二分查詢 雜湊表查詢 二叉排序查詢 排序 插入排序 氣泡排序 歸併排序 快速排序 實現快速排序演算法的關鍵在於先在...

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

查詢和排序是最基本的演算法,在很多指令碼中都會用到查詢和排序。儘管 python 提供的用於查詢和排序的函式能夠滿足絕大多數需求,但還是有必要了解最基本的查詢和排序演算法,以便在有特殊需求的情況下,可以自己編寫查詢 排序指令碼。基本的查詢方法有順序查詢 二分查詢和分塊查詢等。其中,順序查詢是最簡單的...

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

1 查詢表 用於查詢的資料集合,由同一型別的資料元素組成,經常進行的操作 2 靜態查詢表 無需動態修改查詢表的操作,都是靜態查詢表。適合的查詢方法有順序查詢 折半查詢 雜湊查詢。3 動態查詢表 需要動態插入或刪除的操作。適合的查詢方法有二叉排序樹查詢 雜湊查詢。4 關鍵字 資料元素中唯一表示該元素的...