#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
typedef long long ll;
const int maxn=5e5+5;
int n;
int a[maxn];
int temp[maxn];
int dt[maxn];
ll num=0;
void InsertSort(int a[]) //直接插入排序
{
int i, j;
for( i=2; i<=n; i++)
{
if(a[i]<a[i-1])
{
a[0]=a[i];
a[i]=a[i-1];
for(j=i-2; a[0]<a[j]; j--) a[j+1]=a[j];
a[j+1]=a[0];
}
}
}
void tempinInsertSort(int a[]) //折半插入排序
{
for(int i=2; i<=n; i++)
{
a[0]=a[i];
int low=1, high=i-1, mid;
while(low<=high)
{
mid=low+(high-low)/2;
if(a[0]<a[mid]) high=mid-1;
else low=mid+1;
}
for(int j=i-1; j>=high+1; j--) a[j+1]=a[j];
a[high+1]=a[0];
}
}
归并排序
void MergeSort(int a[],int start, int end)
{
if(start<end)//如果整个区间中元素个数大于1,则继续分割
{
int mid = (start+end)/2 ;
int i=start; //辅助数组的下标
int p = start, q = mid+1;
MergeSort(a, start, mid);
MergeSort(a, mid+1 , end);
while(p<=mid && q<=end)//左右两部分只要有一部分不为空
{
if( a[p]<=a[q])//从左半数组复制到辅助数组
temp[i++] = a[p++];
else
{
temp[i++] = a[q++];//从右半数组复制到辅助数组
num+=mid-p+1; //求逆序数
}
}
while(p<=mid) temp[i++]=a[p++];
while(q<=end) temp[i++]=a[q++];
for(int j = start ; j <= end; j++)//将temp中排好序的元素复制到a中
a[j] = temp[j];
}
//return num; // 获得数组的逆序数
}
//希尔排序
void ShellInsert(int a[], int dk) //相差dk的每一组排序
{
int i, j;
for( i=dk+1; i<=n; i++)
{
if(a[i]<a[i-dk])
{
a[0]=a[i];
for( j=i-dk; j>0 && a[0]<a[j]; j-=dk)
a[j+dk]=a[j];
a[j+dk]=a[0];
}
}
}
void ShellSort(int a[], int dt[], int t)
{
for(int k=0; k<t; k++)
ShellInsert(a, dt[k]);
}
//dk数组的选取
void ShellDt(int n_) //根据数组大小对dk数组的初始化
{
int i=0;
int dk=n_/2;
while(dk>=1)
{
dt[i++]=dk;
dk/=2;
}
}
///快速排序
int Partition(int a[], int low, int high)
{
a[0]=a[low];
int pivotkey=a[low];
while(low<high)
{
while(low<high && a[high]>=pivotkey) --high;
a[low]=a[high];
while(low<high && a[low]<=pivotkey) ++low;
a[high]=a[low];
}
a[low]=a[0];
return low;
}
void Qsort(int a[], int low, int high)
{
if(low<high)
{
int pivotkey=Partition(a, low, high);
Qsort(a, low, pivotkey-1);
Qsort(a, pivotkey+1, high);
}
}
基数排序
void Distribute();
int main()
{
cin>>n;
for(int i=1; i<=n; i++) cin>>a[i];
// InsertSort(a);
// tempinInsertSort(a);
// MergeSort(a, 1, n);
// ShellDt(n);
// ShellSort(a,dt,n);
Qsort(a, 1, n);
for(int i=1; i<=n; i++) cout<<a[i]<<' ';
return 0;
}
插入,归并,希尔,快排,基数排序的C++实现
最新推荐文章于 2023-03-10 11:40:58 发布