0
点赞
收藏
分享

微信扫一扫

各种排序算法汇总

玉新行者 2022-03-30 阅读 70

(1)冒泡排序

#include<iostream>
using namespace std;
int main() {
	//利用冒泡排序实现升序排列,排序的次数为元素数-1
//每轮对比次数:元素个数-排序轮数-1;
	int A[6]= {4,3,1,5,3},i;
	for(i=0; i<6; i++) {
		cout<<A[i]<<" ";
	}
	cout<<endl;
//开始冒泡排序
//总共排序轮数为6-1
	for(int i=0; i<6-1; i++) {
		//内层循环对比 次数=元素个数-排序轮数-1
		for(int j=i; j<6-i-1; j++) {
			if(A[j]>A[j+1])
				swap(A[j],A[j+1]);
			}
	}
	for(int i=0;i<6;i++)
	 {cout<<A[i]<<" ";
	 }
	return 0;
}

(2)归并排序

#include<iostream>
#include<algorithm>
using  namespace  std;
//归并排序 
void  mergesort(int  *A,  int  *temp,  int  left,  int  right) {
	if(left>=right)return;
	int mid=(left+right)/2;//找到中间位置
	mergesort(A,temp,left,mid);//递归处理前半部分
	mergesort(A,temp,mid+1,right);//递归处理后半部分
	for(int i=left; i<=right; i++)
		temp[i]=A[i];//将A中元素赋值给temp数组中
	int i1=left;
	int i2=mid+1;
	for(int curr=left; curr<=right; curr++) {
		if(i1==mid+1)
			A[curr]=temp[i2++]; 
		else if(i2>right)//如果超过数组总元素 
			A[curr]=temp[i1++];
		else if(temp[i1]<temp[i2])
			A[curr]=temp[i1++];
		else A[curr]=temp[i2++];
	}
}
int  main() {
	int  n;
	scanf("%d",  &n);
	int  *a,  *temp;
	a  =  new  int[n];
	temp  =  new  int[n];
	for(int  i  =  0;  i  <  n;  i++)
		cin  >>  a[i];
	mergesort(a,  temp,  0,  n  -  1);
	for(int  i  =  0;  i  <  n;  i++)
		cout  <<  a[i]  <<  "  ";
	cout  <<  endl;
	return  0;
}

(3)快排(sort)

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

inline  int  findpivot(int  *A,  int  i,  int  j) {//找到轴值
	return  (i  +  j)  /  2;
}
inline  int  Partition(int  *A,  int  left,  int  right,  int&  pivot) {//划分实现,
	do {
		while(A[++left]  <  pivot);
		while((left  <  right)  &&  (pivot  <  A[--right]));
		swap(A[left],  A[right]);
	} while(left  <  right);
	return  left;
}
void  qsort(int  *A,  int  left,  int  right) {
	if(right<=left)return ;//若无元素直接返回 
	int pivotindex=findpivot(A,left,right);//找到轴值,即数组中间的元素
	swap(A[pivotindex],A[right]);//将轴值放在数组最后一个位置上,为了不影响对剩下数组的划分操作
	int k=Partition(A,left-1,right,A[right]);//k是划分后右半部分的起始位置
	swap(A[k],A[right]);//再将换到数组最后的原轴值换回来
	qsort(A,left,k-1);//对轴值前半部分进行qsort排序
	qsort(A,k+1,right);//对划分后的后半部分
}
int  main() { 
	int  n;
	scanf("%d",  &n);
	int  *a;
	a  =  new  int[n];
	for(int  i  =  0;  i  <  n;  i++)
		cin  >>  a[i];
	qsort(a,  0,  n  -  1);
	for(int  i  =  0;  i  <  n;  i++)
		cout  <<  a[i]  <<  "  ";
	cout  <<  endl;
	return  0;
}

(4)希尔排序

#  include  <iostream>
#  include  <algorithm>
using  namespace  std;
void  inssort(int  *A,  int  n,  int  incr) {//传进去的incr是增量
	for(int  i  =  incr;  i  <  n;  i  +=  incr)
		for(int  j  =  i;  (j  >=  incr)  &&  (A[j]  <  A[j  -  incr]);  j  -=  incr)
			swap(A[j],  A[j  -  incr]);//交换值
}
void  shellsort(int  *A,  int  n) {
	for(int i=n/2; i>2; i/=2)//这里的i是增量,刚开始以n/2作为增量,然后是n/4....,以此类推
		for(int j=0; j<i; j++)
			inssort(&A[j],n-j,i);//循环进行每一次增量后对应元素大小的判断和减缓 
	inssort(A,n,1);//最后一次增量为一排最后一次 
}
int  main() {
	int  n;
	scanf("%d",  &n);
	int  *a;
	a  =  new  int[n];
	for(int  i  =  0;  i  <  n;  i++)
		cin  >>  a[i];
	shellsort(a,  n);
	for(int  i  =  0;  i  <  n;  i++)
		cout  <<  a[i]  <<  "  ";
	cout  <<  endl;
	return  0;
}
举报

相关推荐

0 条评论