常見的排序演算法

2022-05-04 13:48:07 字數 2102 閱讀 2959

氣泡排序(英語:bubble sort)是一種簡單的排序演算法。它重複地走訪過要排序的數列,一次比較兩個元素,如果他們的順序錯誤就把他們交換過來。走訪數列的工作是重複地進行直到沒有再需要交換,也就是說該數列已經排序完成。這個演算法的名字由來是因為越小的元素會經由交換慢慢「浮」到數列的頂端。

時間複雜度o(n2)

void bubble_sort(int *array,int

len)

}

}}

插入排序(

英語:insertion sort)是一種簡單直觀的排序演算法。它的工作原理是通過構建有序序列,對於未排序資料,在已排序序列中從後向前掃瞄,找到相應位置並插入。

時間複雜度o(n2)

/*

* 從第乙個元素開始,該元素可以認為已經被排序

* 取出下乙個元素,在已經排序的元素序列中從後向前掃瞄

* 如果該元素(已排序)大於新元素,將該元素移到下一位置

* 重複步驟3,直到找到已排序的元素小於或者等於新元素的位置

* 將新元素插入到該位置後

* 最優的時間o(n)

* 最壞的時間o(n2)

* 平均的時間o(n2) */

void insert_sort(int *array,int

len)

}

歸併排序

是利用歸併的思想實現的排序方法,該演算法採用經典的分治(divide-and-conquer)策略(分治法將問題分(divide)成一些小的問題然後遞迴求解,而治(conquer)的階段則將分的階段得到的各答案"修補"在一起,即分而治之)。

分治圖:

兩個有序陣列合併的具體過程:

時間複雜度o(n * log2(n))

/*

分解:將n個元素分成各含n/2個元素的子串行

* 解決:用合併排序法對兩個子串行遞迴地排序

* 合併:合併兩個已排序的子串行以得到排序結果

* 時間複雜度o(n*log2(n)) */

void

merge_sort_recursive(

int arr, int reg, int left, int

right)

void merge_sort(int arr, const

intlen)

二叉堆排序

static

void swap(int *a,int *b)

/**假設"第乙個元素"在陣列中的索引為 0 的話,則父節點和子節點的位置關係如下:

*(01) 索引為i的左孩子的索引是 (2*i+1);

*(02) 索引為i的左孩子的索引是 (2*i+2);

*(03) 索引為i的父結點的索引是 floor((i-1)/2); */

/*自上而下

*/void max_heapify(int array, int start, int

end)

}}void heap_sort(int array,int

len)

}

快速排序

static

void swap(int *a,int *b)

static

int median3(int *array,int left,int

right)

static

void quick_array(int *array,int left,int

right)

swap(&array[i],&array[right-1

]); quick_array(array,left,i-1

); quick_array(array,i+1

,right);

}else

}}void quick_sort(int *array,int

len)

常見的排序演算法

一 氣泡排序 include include void swap int a,int b void bubblesort int arr,int size int main void bubblesort a,5 for int i 0 i 5 i cout 二 選擇排序 void selectio...

常見的排序演算法

需要包含的標頭檔案 include stdafx.h include include include 氣泡排序是穩定排序 時間複雜度 o n 2 void swap int a,int b void bubblesort int a,int n void printnum int a,int n a...

常見的排序演算法

排序演算法是最基礎,也是最簡單的演算法思想,因為應用場景多,書寫簡單,所以應用較為普遍,所以在面試和考試的時候,都會涉及到排序演算法,雖然排序演算法種類很多,但是只要理解了思想,然後靈活運用,那麼就不難記憶.排序演算法兩個需要記憶和理解的點就是 演算法思想和時間複雜度.下面我們就介紹和分析一下常見的...