您的位置:首页 > 编程语言 > C语言/C++

【C++】各种排序算法的实现(基于数组的实现)

2018-03-18 21:33 351 查看

C++基于数组的各种排序算法的实现

包括:
插入排序、折半插入排序、希尔排序、快速排序、直接选择排序、堆排序、归并排序

#include<iostream>
#include<cstring>
using namespace std;

/**************************************/
//插入排序 O(n^2) 稳定
void InsertSort(int a[], int len){
for(int i=0;i<len;i++){
int temp=a[i];
for(int j=i-1;j>=0;j--){
if(temp<a[j]){
a[j+1]=a[j];
a[j]=temp;
}
else break;
}
}
}
/**************************************/

/**************************************/
//折半插入排序 O(nlog2(n)) 稳定
int low,high,middle;
void BinaryInsertSort(int a[], int len){
for(int i=0;i<len;i++){
int temp=a[i];
low=0;high=i-1;
while(low<=high){
middle=(low+high)/2;
if(temp<a[middle]){
high=middle-1;
}
else{
low=middle+1;
}
}
for(int k=i;k>low;k--){
a[k]=a[k-1];
}
a[low]=temp;
}
}
/**************************************/

/**************************************/
//希尔排序 速度很难定量 但是效率挺高的 不稳定的算法
void Shellsort(int a[], int len){
int gap=len-1; //初始增量
bool flag=0;
while(gap>=1){
if(gap==1) flag=1;
for(int i=0;i<len;i++){
if(i+gap<len){
if(a[i]>a[i+gap]){
int temp=a[i];
a[i]=a[i+gap];
a[i+gap]=temp;
}
}
else break;
}
gap=gap/3+1;
if(flag) break;
}
}
/**************************************/

# define MAX 6

/**************************************/
//快速排序
void QuickSort(int a[], int len){
if(len>1){
int temp=a[0], pivotpos=0;
int left[MAX], l=0;
int right[MAX], r=0;
for(int i=1;i<len;i++){
if(a[i]>=temp){
right[r++]=a[i];
pivotpos++;
}
else{
left[l++]=a[i];
}
}

QuickSort(left,l);
QuickSort(right,r);

for(int i=0;i<len;i++){
if(i<l){
a[i]=left[i];
}
else if(i>l){
a[i]=right[i-l-1];
}
else{
a[i]=temp;
}
}

}
}

/*
改进方法:
插入排序对基本有序的序列具有很高的效率,
所以在左右划分以后,如果序列的长度比较小,
可以先不排列(长度一般在5-25),直接放着,
最后用插入排序,这种混合算法效率更高

*/

/**************************************/

/***************************************/
//直接选择排序
//适用于的元素规模很大的序列,即移动操作十分耗时的操作
//该算法的移动操作比其他算法少
void SelectSort(int a[], int len){
for(int i=0;i<len;i++){
int index=i;
int min=a[i];
for(int j=i;j<len;j++){
if(a[j]<min){
min=a[j];
index=j;
}
}
if(index!=i){
int temp=a[i];
a[i]=a[index];
a[index]=temp;
}
}
}
/***************************************/

/***************************************/
/* 堆排序
最大堆(升序) 不稳定排序 */
void heapSort(int a[],int len){
for(int i=len;i>0;i--){
int temp;
for(int j=i/2-1;j>=0;j--){
if(2*j+1<i)
if(a[2*j+1]>=a[j]){
temp=a[2*j+1];
a[2*j+1]=a[j];
a[j]=temp;
}
if(2*j+2<i)
if(a[2*j+2]>=a[j]){
temp=a[2*j+2];
a[2*j+2]=a[j];
a[j]=temp;
}
}
temp=a[0];
a[0]=a[i-1];
a[i-1]=temp;
}
}
/***************************************/

/***************************************/
/*归并排序*/
void mergeSort(int a[],int len){
if(len<=1) return;
if(len==2){
if(a[0]>a[1]){
int temp=a[0];
a[0]=a[1];
a[1]=temp;
}
return;
}

//分 :
int b[MAX],c[MAX];
int p=0,q=0;
for(int i=0;i<len;i++){
if(i<=len/2){
b[p++]=a[i];
}
else{
c[q++]=a[i];
}
}

mergeSort(b,p);
mergeSort(c,q);

//合并(治) :
int i=0,j=0,k=0;
while(i<p&&j<q){
if(b[i]<=c[j]){
a[k++]=b[i++];
}
else{
a[k++]=c[j++];
}
}

while(i<p){
a[k++]=b[i++];
}
while(j<q){
a[k++]=c[j++];
}
}
/***************************************/

int main(){//测试部分
int a[]={21,25,49,25,16,8};
mergeSort(a,6); //更改此函数进行测试
for(int i=0;i<6;i++){
cout<<a[i]<<" ";
}
cout<<endl;
}

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  C Sort Algorithm