数据结构排序的各种操作(C++实现)

//冒泡排序的优化算法
void BubbleSort(int a[],int n)
{
	int i,j,temp;
	for(i=0;i<n-1;i++)
	{
		int flag=0;//交换标志位初始值是0
		for(j=0;j<n-i-1;j++)
		{
			if(a[j]<a[j+1])
			{
				temp=a[j];
				a[j]=a[j+1];
				a[j+1]=temp;
				flag=1; //因为进行了交换操作 标志位flag变成1
			}
		}
		if(flag==0) //若未进行交换 说明数组是有序的 直接返回
			return ;
		//每一轮排序后输出元素顺序
		for(int k=0;k<n;k++)
		{
			cout<<a[k]<<" ";
		}
		cout<<endl;
	}
///
//选择排序
void SelectSort(int a[],int n)
{
	int i,j,k;
	for(i=0;i<n-1;i++)
	{
		k=i;//k记录 假设的最小值所在的位置
		for(j=i+1;j<n;j++)
		{
			if(a[k]>a[j])
				k=j;//k记最小的数的位置  如果k记录最大的数的位置(if(a[k]<a[j]))  则按从大到小排序
		}
		if(k!=i)
		{
			int temp;
			temp=a[i];
			a[i]=a[k];
			a[k]=temp;
		}
		for(int k=0;k<n;k++)
			cout<<a[k]<<" ";
		cout<<endl;

	}
}
//
//快速排序
int Partition(int a[],int low,int high)
{
	int privot=a[low];
	while(low<high)
	{
		while(low<high && a[high]>=privot)
			--high;
		a[low]=a[high];
		while(low<high && a[low]<=privot)
			++low;
		a[high]=a[low];
	}
	a[low]=privot; //a[high]=privot;
	return low;
}
void QuickSort(int a[],int low,int high)
{
	if(low<high)
	{
		int privotpos=Partition(a,low,high);
		QuickSort(a,low,privotpos-1);
		QuickSort(a,privotpos+1,high);
	}
}
///
垒堆排序:完全二叉树
1.创建堆
2.排序
void CreateHeap(int *a,int root,int len)
{
	int i = 2 * root; // 左边子节点的下标
	int t = a[root]; 
	while(i <= len)
	{
		if(i < len) // 说明有两个孩子
		{
			if(a[i] < a[i+1])
				++i;//i为最大孩子的下标
		}
		if(t >= a[i])
			break;
		else
		{
			a[i/2] = a[i];
			i = 2 * i;
		}
	}
	a[i/2] = t;
}
void Sort(int *a,int len)
{
	int i,t;
	for(i = len/2;i>=1;i--)  //第一次创建大根堆
		CreateHeap(a,i,len);
	for(i = len;i>=1;i--)
	{
		t = a[1];
		a[1] = a[i];
		a[i] = t;
		CreateHeap(a,1,i-1);
	}
}

void main()
{
	int a[]  = {0,6,5,4,3,2,1,7,8,9};
	int n = sizeof(a) / sizeof(a[0])-1;
	Sort(a,n);
	for(int i = 1;i<=n;i++)
		cout<<a[i]<<" ";
}
///
//归并排序
int b[7]={0};//辅助数组b
//将表a的两段a[low...mid] 和a[mid+1..high]各自有序,将它们合并成一个有序表
void Merge(int a[],int low,int mid,int high)
{
	int i,j;
	for(int k=low;k<=high;k++)
		b[k]=a[k];        //将a中的元素全部复制到b中
	for(i=low,j=mid+1,k=i;i<=mid&&j<=high;k++)
	{
		if(b[i]<=b[j])    //比较b的左右两段中的元素
			a[k]=b[i++];  //将较小值复制到a中
		else
			a[k]=b[j++];
	}
	while(i<=mid)   a[k++]=b[i++];  //若第一个表未检测完 复制
	while(j<=high)  a[k++]=b[j++];  //若第二个表未检测完 复制

}
void MergSort(int *a,int low,int high)
{
	if(low<high)
	{
		int mid=(low+high)/2;    //从中间划分两个子序列
		MergSort(a,low,mid);	// 对左侧子序列进行递归排序
		MergSort(a,mid+1,high); // 对右侧子序列进行递归排序
		Merge(a,low,mid,high);   //归并
	}
}

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值