各種排序思路總結
/**
* 氣泡排序
* 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...