排序部分專題

2021-09-02 01:15:41 字數 3407 閱讀 8462

各種排序思路總結

/**

* 氣泡排序

* 1 外層迴圈將排序好的除去

* 2 內層迴圈將沒排好的陣列進行前後比較大小,每經過乙個迴圈,最大的數都在最後面

* 穩定排序,時間複雜度o(n2)

* */

/** * 選擇排序

* 先找到第乙個數後的最小值,並將其與之交換(內層迴圈為找到最小值)

* 不穩定,o(n2)

* */

/** * 插入排序

* 1 外層迴圈是將排好續的陣列保留

* 2 內層迴圈是將拿到的陣列進行插入

* 可以是穩定的,o(n2)

* */

/** * 快速排序

* 遞迴分治

* 第一步: 將其劃分兩個區域 partition

* 第二分布: 左邊遞迴,右邊遞迴

* 可以做到穩定 o(nlogn)

* */

/** * 荷蘭國旗問題

* 排序成 左邊小,中間相等,右邊大的情況

* 第一步,利用兩個指標,乙個指向小的部分,乙個指向大的部分

* 第二部分,當前指標遍歷陣列,如果小魚目標值將起放到左邊,大於放到右邊,否則移動下標

* 快排的一部分,三路快排問題,不穩定 o(nlogn),

* */

/** * 堆排序

* 第一步:建立大根堆,當前節點的大於父節點時,將其與之交換,向上調整

* 第二步:將0位置的數與最後的位數交換,即根節點與尾節點交換

* 第三步:做heapify向下調整:找到當前節點與左右子節點的最大值,交換後向下延伸

* 不穩定排序 o(n)

* */

/** * 歸併排序

* 第一步:找到中點

* 第二步 : 遞迴左右子陣列

* 第三步: 合併:此時分為三部分,先理好一遍沒有的,再理好一邊有的

* 穩定 o(nlogn)

* */

具體**實現部分

//

// created by yzm on 11/8/18.

//#include "sort.h"

#include /**

* 氣泡排序

* 1 外層迴圈將排序好的除去

* 2 內層迴圈將沒排好的陣列進行前後比較大小,每經過乙個迴圈,最大的數都在最後面

* * */

void sort::bubblesort(vector&arr)

for( int i = arr.size()-1; i > 0 ; i--)

for( int j = 0; j < i ; j++)

//第一層下來最大的值已經冒泡到最上面的部分

return;

}/**

* 選擇排序

* 先找到第乙個數後的最小值,並將其與之交換(內層迴圈為找到最小值)

* * */

void sort::selecttsort(vector&arr)

swap(arr,i,min);

}return;

}/**

* 插入排序

* 1 外層迴圈是將排好續的陣列保留

* 2 內層迴圈是將拿到的陣列進行插入

* * */

void sort::insertsort1(vector&arr)

}return;

}/**

* 直接插入排序,先挪位置直接插入

* * */

void sort::insertsort2(vector&arr)

}/**

* 快速排序

* 遞迴分治

* 第一步: 將其劃分兩個區域 partition

* 第二分布: 左邊遞迴,右邊遞迴

* 可以做到穩定 o(nlogn)

* */

void sort::quicksort1(vector&arr,int l, int r) else if (arr[cur] == target) else

}vectora = ;

return a;

}//隨機快速排序

void sort::quicksort2(vector&arr, int l, int r)

}/**

* 堆排序

* 第一步:建立大根堆,當前節點的大於父節點時,將其與之交換,向上調整

* 第二步:將0位置的數與最後的位數交換,即根節點與尾節點交換

* 第三步:做heapify向下調整:找到當前節點與左右子節點的最大值,交換後向下延伸

* 不穩定排序 o(n)

* */

void sort::heapsort(vector&arr)

//第二步:將0位置的數與最後的位數交換,即根節點與尾節點交換

int heapsize = arr.size();

swap(arr , 0, --heapsize);

//做heapify調整

while(heapsize > 0)

}/**

* 歸併排序

* 第一步:找到中點

* 第二步 : 遞迴左右子陣列

* 第三步: 合併:此時分為三部分,先理好一遍沒有的,再理好一邊有的

* 穩定 o(nlogn)

* */

void sort::mergesort(vector&arr, int &l, int &r)

void sort:: swap(vector&arr, const int &i,const int &j)

void sort::merge(vector&arr,int &l,int &mid, int &r)

while (i <= mid)

while (j <= r)

for (k = 0; k < help.size(); k++)

}vectorsort::partition(vector&arr, int l, int r) else if (arr[l] == arr[r]) else

}swap(arr, more, r);

vectora = ;

return a;

}/**

* 建立大根堆程式

* 當前節點的大於父節點時,將其與之交換

* * */

void sort::heapinsert(vector&arr, int index)

}void sort::heapify(vector&arr, int index, int size)

swap(arr, index ,largest);//將最大值放在該節點上

index = largest;

left = index * 2 + 1;//向下繼續延伸下去

}}

演算法 排序專題

快速排序 演算法導論版 version1 左邊第乙個元素為主元 include include includeusing namespace std int partition int a,int left,int right swap a i a left return i void swap i...

排序演算法專題

氣泡排序bubblesort 選擇排序selectionsort 插入排序insertsort 歸併排序mergesort 快速排序quicksort 堆排序heapsort 氣泡排序 相鄰元素兩兩比較,將通過比較得到的最大元素放在最後 選擇排序 總是選最小的元素放在當前有序序列的末尾,選n 1次 ...

拓撲排序 專題)

解題報告 拓撲排序的板子題,不想說了。解題報告 這道題看到第一反應是差分約束,然後拓撲排序也可以做,由於所有的邊都是大於0的,如果存在環一定無解 就是拓撲排序佇列長度不是n就說明存在環 在建邊上,因為是最長路所以採用a b w,b向a連一條w的邊,然後從後往前找最長路,由於每個人獎金初始值都是100...