冒泡排序,下标从0开始的,要是从1记得第二个for循环 “j<n-1-i"为"j<n-i”
void bubble_sort()
{
for(int i=0;i<n;i++)
for(int j=0;j<n-1-i;j++)
if(a[j]>a[j+1])
swap(a[j],a[j+1]);
}
选择排序,这里是从下标0开始的
void select_sort()
{
for (int i = 0; i < n; i ++ )
{
int k = i;
for (int j = i+1; j < n; j ++ )
{
if (a[j] < a[k])
k = j;
}
swap(a[i], a[k]);
}
}
快速排序,这里下标从1开始
void quick_sort(int l,int r)
{
if(l>=r)
return ;
int x = a[l];
int low = l,high = r;
while(low<high)
{
while(low<high&&a[high]>=x)high--;
a[low] = a[high];
while(low<high&&a[low]<=x)low++;
a[high] = a[low];
}
a[low] = x;
quick_sort(l,low-1);
quick_sort(low+1,r);
}
归并排序, 这里下标从1开始
void f(int s1,int e1,int s2,int e2)
{
int p=0,p1=s1,p2=s2;
while(p1<=e1&&p2<=e2)
{
if(a[p1]<=a[p2])
b[p++]=a[p1++];
else
{
//求逆序对的话这里加上:cnt+=e1-p1+1;
b[p++]=a[p2++];
}
}
while(p1<=e1)
{
b[p++]=a[p1++];
}
while(p2<=e2)
{
b[p++]=a[p2++];
}
for(int i=s1;i<=e2;i++)
{
a[i] = b[i-s1];
}
return ;
}
void ssort(int l,int r)
{
if(l<r)
{
int mid = l+r >> 1;
ssort(l,mid);
ssort(mid+1,r);
f(l,mid,mid+1,r);
}
}
堆排序 ,这里下标从1开始
#include <bits/stdc++.h>
using namespace std;
const int N = 100010;
int a[N];
int siz,n,m;
void adjust(int x)
{
int temp = x;
if(x*2<=siz&&a[x*2]<a[temp])
temp = x*2;
if(x*2+1<=siz&&a[x*2+1]<a[temp])
temp = x*2+1;
if(x!=temp)
{
swap(a[x],a[temp]);
adjust(temp);
}
}
int main()
{
cin >> n>> m;
for(int i=1;i<=n;i++)
cin >>a[i];
siz=n;
for(int i=n/2;i>=1;i--)
adjust(i);
for(int i=1;i<=m;i++)
{
cout <<a[1]<<" ";
swap(a[1],a[siz--]);
adjust(1);
}
return 0;
}
插入排序
//这里代码是从下标为0开始的
void insert_sort() {
for (int i = 1; i < n; i++) {
int x = a[i];
int j = i - 1;
while (j >= 0 && x < a[j]) {
a[j + 1] = a[j];
j--;
}
a[j + 1] = x;
}
for(int i=0;i<n;i++)
cout <<a[i]<<" ";
}
希尔排序 别名——缩小增量排序 (可以看作插入排序的改进)
#include <bits/stdc++.h>
using namespace std;
const int N = 21010;
int a[N];
int n;
void shell_sort()
{
int gap = n/2;
while(gap>=1)
{
for(int i=gap+1;i<=n;i++)
{
int j = i-gap;
a[0] = a[i];
while(j>0&&a[0]<a[j])
{
a[j+gap] = a[j];
j = j-gap;
}
a[j+gap] = a[0];
}
gap/=2;
}
for(int i=1;i<=n;i++)
cout <<a[i]<<" ";
}
int main()
{
cin >> n;
for(int i=1;i<=n;i++)
cin >>a[i];
shell_sort();
return 0;
}