排序演算法複習

2021-09-26 14:21:33 字數 2695 閱讀 2553

//

// created by nickwang on 2019/8/24.

///*

直接插入排序-----o(n^2)

折半插入排序-----o(n^2)

氣泡排序--------o(n^2)

快速排序--------o(nlogn)

選擇排序--------o(n^2)

堆排序----------o(nlogn)

歸併排序--------o(nlogn)

*/#ifndef c_sort_h

#define c_sort_h

#include #include using namespace std;

class sort

data[index + 1] = currentnum;}}

/** 折半插入排序 o(n^2)

* 演算法思想:在直接插入排序的基礎上,由於有序序列可以折半查詢,找到合適位置後進行移位。

*/void binaryinsert(int data, int n) else

}// 插入位置為high + 1

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

data[high + 1] = currentnum;}}

/** 氣泡排序 o(n^2)

* 演算法思想:兩兩比較待排記錄大小,發現逆序,交換兩個記錄,直到表中沒有逆序記錄存在

*/void bubblesort(int data, int n)

}// 沒有進行交換,說明已經排好序

if (swap == 0)}}

/** 快速排序 o(nlogn)

* 演算法思想:在待排序列中任取乙個記錄,以該記錄為基準,經過一趟交換後,

* 所有比記錄小的都在左邊,比記錄大的都在右邊。

* 然後在對左右兩部分重複上述步驟。

*/int partition(int data, int i, int j)

// 從左邊界開始往右找第乙個比基準大的資料

while (i < j && data[i] < basenum)

i++;

if (i < j)

}// i 的位置就是基準資料該在的位置

data[i] = basenum;

return i;

}void quicksort(int data, int low, int high)}/*

* 選擇排序 o(n^2)

* 演算法思想:每一趟選擇待排記錄中最小的記錄,並放入已排序序列的末尾,

* 直至全部記錄完成。

*/void selectsort(int data, int n)

if (min != i)}}

/** 堆排序 o(nlogn)

* 演算法思想:(小頂堆為例)由堆頂可以得到最小值,然後將其移除,

* 對剩餘n-1個節點進行調整,重新成為乙個堆,再從堆頂獲取最小值。

* 當堆只剩下乙個資料的時候,將其移除後就排成有序序列。

** 陣列儲存二叉樹說明:

* 父節點序號為i,2i為其左孩子,2i+1為其右孩子 (從1開始存)

* 共n個節點,則大於n/2的節點開始為葉子節點

** 建立初始堆:

* 大於n/2的節點為葉子節點,本事滿足堆的定義。

* 於是從n/2節點開始,將其調整為堆。然後對n/2-1調整為堆。

* 對節點i調整過程中,調整時可能使本來滿足堆定義的子樹不再滿足,

* 於是需要逐層向下進行調整。

** 堆頂去除後,剩餘n-1節點調整成新堆:

* 將序號為n的節點與堆頂交換,這時只需要使1~n-1滿足堆的定義,

* 即可將剩餘n-1節點構成堆。這時對堆頂元素進行自上而下的調整。

* 調整方法:將根節點與左右孩子中較小的交換,然後繼續對交換後的子樹進行交換,

* 直到交換到葉子節點。

*/void heapadjust(int data, int begin, int end)

if (data[0] < data[i])

data[currentindex] = data[i];

currentindex = i;

}data[currentindex] = data[0]; // 將堆頂放到合適位置

}void heapsort(int data, int n)

// 每一趟堆頂和最後乙個換

for (int i = n; i > 1; --i) }/*

* 歸併排序 o(nlogn)

* 演算法思想:只有乙個記錄的表是有序的,開始將n個記錄看成n個表,每個表有序。

* 第一趟二路歸併將表1和表2,表3和表4,...,表n-1和表n進行歸併,得到長度為2的表。

* 繼續重複得到長度為4的表,...,直到最後將整個表歸併。

*/void merge(int data, int retdata, int begin, int mid, int end)

// data[begin:mid]還沒有完

while (i <= mid)

// data[mid:end]還沒有完

while (j <= end)

}void mergesort(int data, int retdata, int begin, int end) else

}};#endif //c_sort_h

排序演算法複習

參考自 直接插入排序 從小到大排列 n個資料,第乙個資料平凡有序 假設前i 1個資料串有序,根據第i個的大小將第i個插入到此串中,則前i個的資料串也有序。因此可得到n個資料有序。插入方法 待插入元素為第i元素,數值存為temp,將 i 之前的元素 j 從第 i 1 元素開始與之比較 如果比temp大...

演算法複習 排序

排序中主要有插入排序 氣泡排序 歸併排序 快速排序等 主要從空間消耗 時間複雜度 最差時間複雜度等方面考慮演算法的好處 1.插入排序 插入排序是一種簡單直觀的排序演算法。它的工作原理非常類似於我們抓撲克牌 對於未排序資料 右手抓到的牌 在已排序序列 左手已經排好序的手牌 中從後向前掃瞄,找到相應位置...

演算法複習 排序

穩定的排序 排序之後,源資料中相同的資料相對位置不會發生改變 不穩定的排序 反之。test array 12,10,1,5,10 foreach test as val for i 0 i test i bin test222,58,0,count test222 1 function bin da...