折半查詢的思想及原始碼 常用排序與查詢演算法

2021-10-16 08:18:47 字數 3391 閱讀 8369

選擇排序(selection sort)是一種簡單直觀的排序演算法。它的工作原理是:第一次從待排序的資料元素中選出最小(或最大)的乙個元素,存放在序列的起始位置,然後再從剩餘的未排序元素中尋找到最小(大)元素,然後放到已排序的序列的末尾。以此類推,直到全部待排序的資料元素的個數為零。選擇排序是不穩定的排序方法。

void selectsort(int r,int n)

}if(index!=i)}}

折半插入排序

折半插入排序(binary insertion sort)是對插入排序演算法的一種改進,由於排序演算法過程中,就是不斷的依次將元素插入前面已排好序的序列中。由於前半部分為已排好序的數列,這樣我們不用按順序依次尋找插入點,可以採用折半查詢的方法來加快尋找插入點的速度。

void binsort(int r,int n)else

}for(int j=i-1;j>=high+1;j--)

r[high+1]=r[0];}}

氣泡排序(bubble sort),是一種電腦科學領域的較簡單的排序演算法。它重複地走訪過要排序的元素列,依次比較兩個相鄰的元素,如果順序(如從大到小、首字母從z到a)錯誤就把他們交換過來。走訪元素的工作是重複地進行直到沒有相鄰元素需要交換,也就是說該元素列已經排序完成。這個演算法的名字由來是因為越小的元素會經由交換慢慢「浮」到數列的頂端(公升序或降序排列),就如同碳酸飲料中二氧化碳的氣泡最終會上浮到頂端一樣,故名「氣泡排序」。

void bubblesort(int r,int n)}}

}

void shellsort(int r,int n)

r[j+d]=r[0];}}

}

歸併排序(merge sort)是建立在歸併操作上的一種有效,穩定的排序演算法,該演算法是採用分治法(divide and conquer)的乙個非常典型的應用。將已有序的子串行合併,得到完全有序的序列;即先使每個子串行有序,再使子串行段間有序。若將兩個有序表合併成乙個有序表,稱為二路歸併。

void merge(int a,int n,int left,int mid,int right)

delete l;

delete r;

}void mergesort(int a,int n,int left,int right)

}

快速排序是c.r.a.hoare於2023年提出的一種劃分交換排序。它採用了一種分治的策略。

該方法的基本思想是:

int partition(int r,int first,int end)

while(i            i++;

if(i            temp = r[i];

r[i] = r[j];

r[j] = temp;

j--;}}

return i;

}void quicksort(int r,int first,int end)

}

堆排序是利用堆這種資料結構而設計的一種排序演算法,堆排序是一種選擇排序,它的最壞,最好,平均時間複雜度均為,它也是不穩定排序。首先簡單了解下堆結構。

堆排序的基本思想是:將待排序序列構造成乙個大頂堆。此時,整個序列的最大值就是堆頂的根節點。將根節點與末尾元素進行交換,此時末尾就為最大值。然後將剩餘n-1個元素重新構造成乙個大頂堆,這樣會得到n個元素的次小值。如此反覆執行,便能得到乙個有序序列。

// 堆排序

void heapadjust(int a,int s,int m)//一次篩選的過程

a[s]=rc;//插入

}void heapsort(int a,int n)for(i=s;i>=0;i--)//通過迴圈初始化頂堆

for(i=n;i>=0;i--)

}

基數排序(radix sort)屬於「分配式排序」(distribution sort),又稱「桶子法」(bucket sort)或bin sort,顧名思義,它是透過鍵值的部份資訊,將要排序的元素分配至某些「桶」中,藉以達到排序的作用,基數排序法是屬於穩定性的排序,其時間複雜度為o (nlog(r)m),其中r為所採取的基數,而m為堆數,在某些時候,基數排序法的效率高於其它的穩定性排序法。

//獲取數字的位數

int getlooptimes(int num)

return count;

}//查詢陣列中的最大數

int findmaxnum(int *p, int n)

}return max;

}//將數字分配到各自的桶中,然後按照桶的順序輸出排序結果

void sortsingle(int *p, int n, int loop);

//求桶的index的除數

//如798個位桶index=(798/1)%10=8

//十位桶index=(798/10)%10=9

//百位桶index=(798/100)%10=7

//tempnum為上式中的1、10、100

int tempnum = (int)pow(10, loop - 1);

int i, j;

for(i = 0; i         int row_index = (p[i]/tempnum) % 10;

for(j = 0; j 20; j++)}}

//將桶中的數,倒回到原有陣列中

int k = 0;

for(int i = 0; i 10; i++)}}

}void bucketsort(int *p, int n)

}

在常規無序陣列中,設陣列項個數為n,則乙個陣列項平均查詢長度為n/2。極端情況下,查詢資料項在陣列最後,則需要n步才能找到。

int findlinear(int* p,int n,int k)

}//查詢失敗,返回-1

return -1;

}

二分查詢也稱折半查詢(binary search),它是一種效率較高的查詢方法。但是,折半查詢要求線性表必須採用順序儲存結構,而且表中元素按關鍵字有序排列。

首先,假設表中元素是按公升序排列,將表中間位置記錄的關鍵字與查詢關鍵字比較,如果兩者相等,則查詢成功;否則利用中間位置記錄將表分成前、後兩個子表,如果中間位置記錄的關鍵字大於查詢關鍵字,則進一步查詢前一子表,否則進一步查詢後一子表。重複以上過程,直到找到滿足條件的記錄,使查詢成功,或直到子表不存在為止,此時查詢不成功。

// 折半查詢

int binarysearch(int* p ,int n,int k) else else }}

}

折半查詢的思想及原始碼 常用排序與查詢演算法

選擇排序 selection sort 是一種簡單直觀的排序演算法。它的工作原理是 第一次從待排序的資料元素中選出最小 或最大 的乙個元素,存放在序列的起始位置,然後再從剩餘的未排序元素中尋找到最小 大 元素,然後放到已排序的序列的末尾。以此類推,直到全部待排序的資料元素的個數為零。選擇排序是不穩定...

折半查詢思想及實戰程式設計

1.折半查詢要求是陣列是有序為前提 如果不是有序的不能使用 2.提及查詢存在兩種情況,要麼資料存不存在要麼存在下標是多少 下面講解折半查詢的思想 首先定義乙個有序陣列 int array 10 1 10一共有10個資料,將這10個數進行編號,從0開始編號,即0 9 令left 0,right 9,m...

C語言實現選擇 插入 氣泡排序的思想及原始碼

在資料結構的書中肯定有一章的內容是實現排序,不同的排序方法適用的場景不同,時間複雜度也不同,在本篇部落格中寫到了三種最基本的排序,另外,希爾排序,快速排序分別是插入和氣泡排序的衍生,故熟悉基本的排序思想變得尤為重要,在此附上三種基本排序的原始碼 include include include 定義交...