一、冒泡排序
P1059 明明的随机数
#include <stdio.h>
#include <iostream>
#include <algorithm>
using namespace std;
int n;
int a[101];
void bubble_sort(int *arr){
for(int i=0;i<n;i++)
for(int j=0;j<n-1;j++)
if(arr[j] > arr[j+1])
swap(arr[j],arr[j+1]);
}
int main(void){
cin >> n;
for(int i=0;i<n;i++) cin >> a[i];
bubble_sort(a);
n = unique(a,a+n)-a;
cout << n << endl;
for(int i=0;i<n;i++) cout << a[i] << " ";
return 0;
}
二、选择排序
P1059 明明的随机数
#include <stdio.h>
#include <iostream>
#include <algorithm>
using namespace std;
int n;
int a[101];
void selection_sort(int *arr){
int p;
for(int i=0;i<n;i++)
{
p = i;
for(int j=i+1;j<n;j++)
if(arr[p] > arr[j]) p = j;
swap(arr[p],arr[i]);
}
}
int main(void){
cin >> n;
for(int i=0;i<n;i++) cin >> a[i];
selection_sort(a);
n = unique(a,a+n)-a;
cout << n << endl;
for(int i=0;i<n;i++) cout << a[i] << " ";
return 0;
}
三、插入排序
P1059 明明的随机数
#include <stdio.h>
#include <iostream>
#include <algorithm>
using namespace std;
int n;
int a[101];
void insertion_sort(int *arr){
for(int i=1;i<n;i++){
int temp = arr[i];
int j=i;
while(--j>=0 && a[j]>=temp)
a[j+1] = a[j];
a[j+1] = temp;
}
}
int main(void){
cin >> n;
for(int i=0;i<n;i++) cin >> a[i];
insertion_sort(a);
n = unique(a,a+n)-a;
cout << n << endl;
for(int i=0;i<n;i++) cout << a[i] << " ";
return 0;
}
四、归并排序
P1908 逆序对
#include <stdio.h>
#include <iostream>
using namespace std;
#define MAXN 500001
long long n,ans;
int a[MAXN],temp[MAXN];
void merge_sort(int *arr, int L, int R){
if(L == R) return;
int mid = (L+R)>>1;
merge_sort(arr,L,mid);
merge_sort(arr,mid+1,R);
int l = L;
int r = mid+1;
for(int i=L;i<=R;i++){
if(l <= mid){
if(r <= R){
if(arr[l] <= arr[r]) temp[i] = arr[l++];
else {
temp[i] = arr[r++];
ans += mid-l+1;
}
}
else temp[i] = arr[l++];
}
else temp[i] = arr[r++];
}
for(int i=L;i<=R;i++) arr[i] = temp[i];
}
int main(void){
cin >> n;
for(int i=0;i<n;i++) cin >> a[i];
merge_sort(a,0,n-1);
cout << ans;
return 0;
}
五、快速排序
P1177 【模板】快速排序
#include <stdio.h>
#include <iostream>
using namespace std;
#define MAXN 100001
int n,ans;
int a[MAXN],temp[MAXN];
void quick_sort(int *arr, int L, int R){
if(L >= R) return;
int mid = a[(L+R)>>1];
int l=L,r=R;
while(l < r){
while(arr[l]<mid) l++;
while(arr[r]>mid) r--;
if(l <= r){
swap(arr[l],arr[r]);
l++;
r--;
}
}
quick_sort(arr,L,r);
quick_sort(arr,l,R);
}
int main(void){
cin >> n;
for(int i=0;i<n;i++) cin >> a[i];
quick_sort(a,0,n-1);
for(int i=0;i<n;i++) cout << a[i] << " ";
return 0;
}
六、堆排序
P1177 【模板】快速排序
#include <stdio.h>
#include <iostream>
using namespace std;
#define MAXN 100001
int n;
int heap[MAXN];
void adjust_heap(int *arr, int k, int len){
int p;
while(k<<1 <= len){
p = k<<1;
if((p|1)<=len && arr[p]<arr[p|1]) p++;
if(arr[p] > arr[k]){
swap(arr[p],arr[k]);
k = p;
}
else return;
}
}
void heap_sort(int *arr){
for(int i=n>>1;i>0;i--) adjust_heap(arr,i,n);
for(int i=n;i>1;i--){
swap(arr[1],arr[i]);
adjust_heap(arr,1,i-1);
}
}
int main(void){
cin >> n;
for(int i=1;i<=n;i++)
cin >> heap[i];
heap_sort(heap);
for(int i=1;i<=n;i++) cout << heap[i] << " ";
return 0;
}
七、桶排序
P1059 明明的随机数
#include <stdio.h>
#include <iostream>
using namespace std;
#define MAXN 1001
int n,ans;
int a[MAXN],bucket[MAXN];
void bucket_sort(int *arr){
for(int i=1;i<=n;i++)
bucket[arr[i]]++;
}
int main(void){
cin >> n;
for(int i=1;i<=n;i++)
cin >> a[i];
bucket_sort(a);
for(int i=1;i<=MAXN;i++){
if(bucket[i]) ans++;
}
cout << ans << endl;
for(int i=1;i<=MAXN;i++){
if(bucket[i])
cout << i << " ";
}
return 0;
}