//
//冒泡排序
//
#include <bits/stdc++.h>
using namespace std;
void bubbleSort(int arr[],int len){
bool flag = false;
for(int i=0;i<len-1;i++){
flag = false;
for(int j=0;j<len-i-1;j++){
if(arr[j] > arr[j+1]){
swap(arr[j],arr[j+1]);
flag = true;
}
}
if(!flag){
break;
}
}
}
//
// 计数排序
//
#include <bits/stdc++.h>
using namespace std;
void countingSort(int arr[],int len){
int maxn = 0;
for(int i=0;i<len;i++){maxn = max(maxn,arr[i]);}
int t = maxn;
int *cen = new int[maxn+10];
for(int i=0;i<=maxn;i++){cen[i] = 0;}
for(int i=0;i<len;i++){cen[arr[i]]++;}
for(int i=1;i<=maxn;i++){cen[i] += cen[i-1];}
int *ans = new int[len];
for(int i=0;i<len;i++){
ans[cen[arr[i]]-1] = arr[i];
cen[arr[i]]--;
}
for(int i=0;i<len;i++){
arr[i] = ans[i];
}
delete []ans;
delete []cen;
}
//堆排序
#include <bits/stdc++.h>
using namespace std;
int heapSize = 0;
int left(int x){
if(2*x+1 >= heapSize) return -1;
return 2*x+1;
}
int right(int x){
if(2*x+2 >= heapSize) return -1;
return 2*x+2;
}
void minHeapify(int arr[],int x){
int L = left(x);
int R = right(x);
int mann = x;
if(L != -1 && arr[L] > arr[mann]){mann = L;}
if(R != -1 && arr[R] > arr[mann]){mann = R;}
if(mann != x){
swap(arr[x],arr[mann]);
x = mann;
minHeapify(arr,x);
}
}
void Delete(int arr[]){
swap(arr[heapSize-1],arr[0]);
heapSize--;
minHeapify(arr,0);
}
void heapSort(int arr[],int len){
//建立大顶堆
heapSize = len;
for(int i=(len-1)/2;i>=0;i--){
minHeapify(arr,i);
}
//从堆中取结点
for(int i=0;i<len;i++){
Delete(arr);
}
}
//
// 直接插入排序
//
#include <bits/stdc++.h>
using namespace std;
void insertSort(int arr[],int len){
for(int i=1;i<len-1;i++){
int j = i-1;
int key = arr[i];
while(j>=0 && arr[j] > key){
arr[j+1] = arr[j];
j--;
}
arr[j+1] = key;
}
}
//
// 归并排序
//
#include <bits/stdc++.h>
using namespace std;
void merge(int arr[],int l,int r){
int mid = (l+r)/2;
int nL = mid-l+1;
int nR = r-mid;
//创建两个行的数组存放
int *L = new int[nL];
int *R = new int[nR];
for(int i=0;i<nL;i++){L[i]=arr[l+i];}
for(int i=0;i<nR;i++){R[i]=arr[i+mid+1];}
int i=0,j=0; //分别指向L和R
for(int k=l;k<=r;k++){
if(j>=nR || (i<nL && L[i]<=R[j])){
arr[k] = L[i++];
}else{
arr[k] = R[j++];
}
}
}
void mergeSort(int arr[],int l,int r){
if(l < r){
int mid = (l+r)/2;
mergeSort(arr,l,mid);
mergeSort(arr,mid+1,r);
merge(arr,l,r);
}
}
//
// 鸽巢排序
//
#include <bits/stdc++.h>
using namespace std;
void pigeonSort(int arr[],int len){
int k = 0;
for(int i=0;i<len;i++){k = max(k,arr[i]);}
int *cen = new int[k+10];
for(int i=0;i<=k;i++){cen[i]=0;}
for(int i=0;i<len;i++){cen[arr[i]]++;}
int j=0;
for(int i=0;i<=k;i++){
while(cen[i]){
arr[j++] = i;
cen[i]--;
}
}
delete []cen;
}
//
//两种随机快排
//
#include <bits/stdc++.h>
using namespace std;
int partition(int arr[],int l,int r){
int rd = l+rand()%(r-l);
swap(arr[l],arr[rd]);
int key = arr[rd];
int i=l;
for(int j=l;j<r;j++){
if(arr[j] < key){
swap(arr[i],arr[j]);
i++;
}
}
swap(arr[i],arr[r]);
return i;
}
int partition2(int arr[],int l, int r){
int ld = l+rand()%(r-l);
swap(arr[l],arr[ld]);
int key = arr[l];
while(l < r){
while(l<r && arr[l] <= key){l++;}
arr[r] = arr[l];
while(l<r && arr[r] > key){r--;}
arr[l] = arr[r];
}
arr[l] = key;
return l;
}
void quicksort(int arr[],int l,int r){
if(l < r){
int mid = partition2(arr,l,r);
quicksort(arr,l,mid-1);
quicksort(arr,mid+1,r);
}
}
//
// 基数排序
//
#include <bits/stdc++.h>
using namespace std;
void redixSort(int arr[],int len){
int maxn = 0;
for(int i=0;i<len;i++){maxn = max(arr[i],maxn);}
int t = maxn;
int d = 0;
while(t){t/=10;d++;}
int mod = 10;
for(int k=0;k<d;k++){
queue<int> Bucket[10];
for(int i=0;i<len;i++){
Bucket[(arr[i]%mod) / (mod/10)].push(arr[i]);
}
int j=0;
for(int i=0;i<10;i++){
while(!Bucket[i].empty()){
arr[j++] = Bucket[i].front();
Bucket[i].pop();
}
}
mod *= 10;
}
}
//
// 选择排序
//
#include <bits/stdc++.h>
using namespace std;
void selectSort(int arr[],int len){
for(int i=0;i<len-1;i++){
int minx = i;
for(int j=i+1;j<len;j++){
if(arr[j] < arr[minx]){minx = j;}
}
swap(arr[i],arr[minx]);
}
}
//
// 希尔排序
//
#include <bits/stdc++.h>
using namespace std;
void shellSort(int arr[],int len){
int gap = len/2;
while(gap >= 1){
//做一个直接插入
for(int i=gap;i<len;i++){
int j = i - gap;
int key = arr[i];
while(j>=0 && arr[j] > key){
arr[j+gap] = arr[j];
j=j-gap;
}
arr[j+gap] = key;
}
gap = gap/2;
}
}
如果有看不懂的地方,欢迎私聊和留下评论。。。必定及时解释