快排、归并排序、堆排序的实现

本文展示了三种常见的排序算法:快速排序、归并排序和堆排序的C++实现。通过示例代码,详细解释了每种排序算法的工作原理,包括主函数中的测试用例,方便读者理解和应用。
摘要由CSDN通过智能技术生成
#include <iostream>
using namespace std;

//quick_sort
void quick(int *a,int start,int end)
{
   if (start>=end) return;
   int startx=start;
   int endx=end;
   int key=a[start];
   while(start<end)
   {
       while(a[end]>=key&&start<end)
	   {
		   end--;
	   }
	   a[start]=a[end];
	   while(a[start]<=key&&start<end)
	   {
	       start++;
	   }
	   a[end]=a[start];
   }
   a[start]=key;
   quick(a,startx,start-1);
   quick(a,start+1,endx);
}

//merge_sort
void merge(int *a,int start,int mid,int end)
{
	while(mid<=end)
	{
	   int key=a[mid];
	   int j=mid;
	   while(key<a[j-1]&&j>start)
	   {
		   a[j]=a[j-1];
		   j--;
	   }
	   a[j]=key;
	   mid++;
	}
}

void merge_sort(int *a,int start,int end)
{
	if(start>=end) return;
	int mid=(start+end)/2;
    merge_sort(a,start,mid);
	merge_sort(a,mid+1,end);
	merge(a,start,mid+1,end);
}

void exch(int& a,int& b)
{
   a=a^b;
   b=a^b;
   a=a^b;
}

bool less(int a,int b)
{
   return a<b;
}

void fixdown(int *a,int k,int n)//从第k个位置开始向下堆化
{
    int j;
	while(2*k<=n)
	{
	   j=2*k;
	   if(j<n&&less(a[j],a[j+1]))
		   j++;
	   if(!less(a[k],a[j])) 
		   break;
	   exch(a[k],a[j]);
	   k=j;
	}
}


void heap_sort(int *a,int n)
{   
   for(int i=n/2;i>=1;i--)
   {
      fixdown(a,i,n);
   }
   while(n>1)
   {
       exch(a[1],a[n]);
	   fixdown(a,1,--n);
   }
}


int main()
{
	int a[101];
	for(int i=1;i<=100;i++)
	{
		a[i]=101-i;
	}
	heap_sort(a,100);//堆排序测试
	for(int i=1;i<=100;i++)
		cout<<a[i]<<",";

	int n;
	cin>>n;
	for(int i=0;i<n;i++)
	{
		cin>>a[i];
	}
	// quick(a,0,n-1);//快速排序测试
	merge_sort(a,0,n-1);//归并排序测试
	for(int i=0;i<n;i++)
	{
		cout<<a[i]<<" ";
	}
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值