1. 程式人生 > >C-常見的排序與查詢演算法

C-常見的排序與查詢演算法

排序演算法:冒泡,快排

查詢演算法:二分查詢

冒泡
基本思想:它重複地走訪過要排序的數列,一次比較兩個元素,如果它們的順序錯誤就把它們交換過來。走訪數列的工作是重複地進行直到沒有再需要交換,也就是說該數列已經排序完成。這個演算法的名字由來是因為越小的元素會經由交換慢慢“浮”到數列的頂端。
1.比較相鄰的元素。如果第一個比第二個大,就交換它們兩個;
2.對每一對相鄰元素作同樣的工作,從開始第一對到結尾的最後一對,這樣在最後的元素應該會是最大的數;
3.針對所有的元素重複以上的步驟,除了最後一個;
4.重複步驟1~3,直到排序完成。

void swap(int
*a, int* b) { int tmp; tmp = *a; *a = *b; *b = tmp; } void bubble_sort(int arr[], int len) { int i, j; for (i = 0; i < len - 1; i++) { for (j = 0; j < len - 1 - i; j++) { if (arr[j] > arr[j + 1]) { swap(&arr[j], &arr[j + 1
]); } } } }

快速排序
基本思想:
通過一趟排序將要排序的資料分割成獨立的兩部分,其中一部分的所有資料都比另外一部分的所有資料都要小,然後再按此方法對這兩部分資料分別進行快速排序,整個排序過程可以遞迴進行,以此達到整個資料變成有序序列。

/************************************ 
 *函式名:quicksort 
 *作用:快速排序演算法 
 *引數: 
 *返回值:無 
 ************************************/  
void quicksort(int array[], int maxlen, int begin
, int end) { int i, j; if(begin < end) { i = begin + 1; // 將array[begin]作為基準數,因此從array[begin+1]開始與基準數比較! j = end; // array[end]是陣列的最後一位 while(i < j) { if(array[i] > array[begin]) // 如果比較的陣列元素大於基準數,則交換位置。 { swap(&array[i], &array[j]); // 交換兩個數 j--; } else { i++; // 將陣列向後移一位,繼續與基準數比較。 } } /* 跳出while迴圈後,i = j。 * 此時陣列被分割成兩個部分 --> array[begin+1] ~ array[i-1] < array[begin] * --> array[i+1] ~ array[end] > array[begin] * 這個時候將陣列array分成兩個部分,再將array[i]與array[begin]進行比較,決定array[i]的位置。 * 最後將array[i]與array[begin]交換,進行兩個分割部分的排序!以此類推,直到最後i = j不滿足條件就退出! */ if(array[i] >= array[begin]) // 這裡必須要取等“>=”,否則陣列元素由相同的值時,會出現錯誤! { i--; } swap(&array[begin], &array[i]); // 交換array[i]與array[begin] quicksort(array, maxlen, begin, i); quicksort(array, maxlen, j, end); } }

二分查詢
基本思想:也稱為是折半查詢,屬於有序查詢演算法。用給定值k先與中間結點的關鍵字比較,中間結點把線形表分成兩個子表,若相等則查詢成功;若不相等,再根據k與該中間結點關鍵字的比較結果確定下一步查詢哪個子表,這樣遞迴進行,直到查詢到或查詢結束髮現表中沒有這樣的結點。

int binary_search(int arr[], int value,int len)
{
    int low, high, mid;
    low = 0;
    high = len - 1;
    while (low <= high)
    {

        mid = low + ((high - low)>>1);
        if (arr[mid] == value)
        {
            return mid;
        }
        if (arr[mid] < value)
        {
            low = mid + 1;
        }
        if (arr[mid] > value)
        {
            high = mid - 1;

        }

    }
    return -1;
}

相關推薦

C-常見排序查詢演算法

排序演算法:冒泡,快排 查詢演算法:二分查詢 冒泡 基本思想:它重複地走訪過要排序的數列,一次比較兩個元素,如果它們的順序錯誤就把它們交換過來。走訪數列的工作是重複地進行直到沒有再需要交

資料結構——排序查詢(4)——常見的內部排序演算法大全

這篇博文就讓我水一次,這兩天量產部落格,偷個懶,不過下面的文章都是我自己寫的: 插入排序演算法及其分析 簡單的氣泡排序及其分析 希爾排序及其分析 快速排序演算法及其分析 合併排序演算法及其分析 堆排序演算法及其分析 選擇排序演算法及其分析

資料結構——排序查詢(2)——希爾排序C++實現)

希爾排序原理 希爾排序(Shell’s Sort),也稱為“縮小增量排序”,是一種插入排序類的演算法。最簡單的插入排序,我在上一個專欄的一篇文章C++抽象程式設計——演算法分析(8)——插入排序演算法與分析有提到過,這裡就不再贅述,這裡就只介紹一些我以前沒寫過的演算法。 希爾排序是一

資料結構——排序查詢(5)——折半查詢C++實現)法

順序查詢 順序查詢,是一種最直觀的查詢方式。原理閒蕩簡單就是我們正常思維的查詢,從給定的序列出發,依次檢查序列中的每一個專案是否為我們給定的關鍵字。是則查詢成功,否則查詢失敗。 bool searchByOrder(vecter<int> vec){ for(int

資料結構——排序查詢(3)——氣泡排序C++實現)

交換排序演算法 所謂交換,意思是說根據所給的序列,對其中的兩個元素進行大小比較,若為逆序,那麼我們就交換它。這樣就達到了排序的目的。接下來介紹最簡單的交換排序——氣泡排序。 氣泡排序的原理 氣泡排序的原理很簡單,它反覆遍歷要排序的列表,比較每對相鄰的專案,如果它們的順序錯誤則

排序查詢的最好演算法

排序與查詢演算法有很多種,我們不必全部記住它,只需記住最快的方法就好了(當然,你也可以用c#自帶的方法或者Linq,這不在本文討論之列) 直接上程式碼: /// <summary> /// 折半查詢 /// </sum

基礎演算法——排序查詢

1. 數字排序 1.1 演算法——冒泡演算法 //相鄰 public class BubbleSortDemo{ public static void main(String []args){ int[] ary={1,2,3,4,5,9,6,7,8}; //遍歷

C語言 資料結構排序查詢 資料結構實驗之排序三:bucket sort

資料結構實驗之排序三:bucket sort Time Limit: 250MS Memory Limit: 65536KB Submit Statistic Problem Description 根據人口普查結果,知道目前淄博市大約500萬人口,你的

python資料結構演算法27 排序查詢 順序查詢

現在我們轉向排序與查詢的內容,這一節研究查詢,後半章研究排序。查詢是在一個數據集裡找到某個特定元素的演算法過程。查詢的結果可能是找到或沒找到,所以返回值是True或False。這裡為簡單起見,我們只涉及與列表成員相關的問題。 在python裡,有一個非常簡單的方法查詢某資料是否在列表裡,使用in操作符:

結構演算法(04):排序規則查詢演算法

本文原始碼:[GitHub·點這裡](https://github.com/cicadasmile/model-arithmetic-parent) || [GitEE·點這裡](https://gitee.com/cicadasmile/model-arithmetic-parent) # 一、遞迴演算

C#常見排序算法

插入 list 插入排序 done amp nbsp void pre 排序 1.冒泡排序 1 public void sortM(int[] list) 2 { 3 int i, j, temp; 4

資料結構——排序查詢(1)——排序查詢簡介

排序與查詢 排序,是指將一系列無序的記錄,通過某種方式或者演算法,將其變為有序的過程。如果排出來的順序是由小到大排列,我們就稱這種排序叫升序排序。如果是由大到小,我們就稱為降序排序。例如有一組資料 : 開始時為: 2 4 7 1 9 升序排序: 1 2 4 7 9 降序排序: 9 7

C++ 歸併排序快速排序

歸併排序: 【演算法邏輯】 歸併的思路(分治)是把一個大問題a拆解成兩個小問題b和c,解決了兩個子問題再整合一下,就解決了原問題。用遞迴的方法,先分解再合併(分治是一種解決問題的處理思想,遞迴是一種程式設計技巧,這兩者並不衝突): 【程式碼實現】 #include<io

C語言學習_查詢演算法(二)

3 分塊查詢 演算法思想:將待查的元素均勻的分成塊,塊間按大小順序排序,塊內不排序。 具體的,設待查元素有15 個,將其按關鍵字大小分成3塊,這15個數的排列是一個有序序列,也可以給出無序序列,但也是必須得滿足分在第一塊中的任意元素小於第二塊中的所有數,第二塊中的任意元素

二叉排序查詢演算法之php實現

        二叉排序樹,又稱為二叉查詢樹。它或者是一棵空樹,或者是具有下列性質的二叉樹。                1.若它的左子樹不空,則左子樹上所有結點的值均小於它的根結點的值                2.若它的右子樹不空,則右子樹上所有結點的值均小於它

c語言】折半查詢演算法

折半查詢 又稱為二分查詢,優點是比較次數少,查詢速度快,平均效能好,佔用系統記憶體較少;其缺點是要求待查表為有序表,且插入刪除困難。因此,折半查詢方法適用於不經常變動而查詢頻繁的有序列表。首先,假設表中元素是按升序排列,將表中間位置記錄的關鍵字與查詢關鍵字比較,

再談資料結構(四):排序查詢

1 - 引言 雖然C++中的STL庫中提供了許多排序和查詢的方法。但是我們還是需要了解一下排序和查詢內部的原理,下面讓我們學習一下各類排序與查詢演算法 2 - 歸併排序 第一種高效的排序演算法是歸併排序,按照分治三步法,對歸併排序演算法介紹如下: 劃分問題:把序列分成

c語言的七大查詢演算法,非常值得學習

今天帶著大家學習下,C語言七大查詢演算法!!!!!!!!!!這裡我們首先看下演算法的概念:  演算法(Algorithm)是指解題方案的準確而完整的描述,是一系列解決問題的清晰指令,演算法代表著用系統的方法描述解決問題的策略機制。也就是說,能夠對一定規範的輸入,在有限時間內獲

c#-氣泡排序通用委託

class Employee { public string name; public int salary; public static bool SortSalary(Employee e0,Employe

C語言版二分查詢演算法

二分查詢演算法是在有序陣列中用到的較為頻繁的一種演算法,在未接觸二分查詢演算法時,最通用的一種做法是,對陣列進行遍歷,跟每個元素進行比較,其時間為O(n).但二分查詢演算法則更優,因為其查詢時間為O(