选择排序、冒泡排序、插入排序、基数排序、快速排序、归并排序完整C++实现

不吹不黑,这几种排序算法真的挺重要的,数据结构这门课程也是很重要的!!!CSDN博客上有很详细的讲解,讲的也很好,我发现唯一的缺点是没有一份完整的实现较好的代码,供大家学习参考,所以在此附上一份完整的C++语言实现代码,这份代码对各种排序算法的实现度较高,算是一个完整的小程序吧,同时还有各种排序算法的中间过程,对初学者也比较友好,希望对大家能够有所帮助吧。

#include<iostream>

using namespace std ;

class SORT
{
	public:
		void InsertSort(int data[],int n);   // 插入排序 
		void BubbleSort(int data[],int n);  // 冒泡排序 
		void SelectSort(int data[],int n); //  选择排序 
	    void RadioSort(int data[],int n) ; //基数排序
		void QuickSort(int data[], int left ,int right) ;//快速排序 
		void MergSort(int data[],int first,int mid,int last,int temp[]);  //归并排序 
		void Merge(int data[],int first,int last,int temp[]);
 } ;
 //冒泡排序 
void SORT::BubbleSort(int data[],int n)
 {
      int temp;
      for (int i = 0; i < n; ++i)
      {
           for (int j = 0; j < n - i - 1; ++j)
           {
                if (data[j] > data[j + 1])
                {
                     temp = data[j];
                     data[j] = data[j + 1];
                     data[j + 1] = temp;
                }
           }
           cout<<"*";
            for(int i=0;i<n;++i) cout<<data[i]<<' ';
            cout<<endl;
      }
 }
 //选择排序 
void SORT::SelectSort(int data[],int n)
{ 
 for(int j=0;j<n;j++) 
 { 
	 int min=data[j],mink=j;                       //先假设未排序的首元素是最小的数 
	 for(int k=j;k<n;k++)                    //找到尚未排序的元素中最小的数 
	 { 
		 if(data[k]<min) 
		 { 
			 min=data[k]; 
			 mink=k; 
		 } 
	 } 
	 int temp=data[j];                            //交换两个元素 
	 data[j]=data[mink]; 
	 data[mink]=temp; 
	 cout<<"*";
     for(int i=0;i<n;++i) cout<<data[i]<<' ';
      cout<<endl;
 } 
}
//插入排序 
void SORT::InsertSort(int data[],int n)
{
  //向有序数组中插入元素
  int i,key ;
   for(i=1;i<n;++i) //从数组的第二个元素开始 
   {
     key = data[i];  //记录当前的元素 
	 int j = i-1;
	 while(j>=0&&key<data[j])  //将当前元素与之前的已经排好序的序列元素进行挨个比较
	 {
	 data[j+1] = data[j] ;  //已经排序好的元素整体后移
	 --j; 
     }
		 data[j+1] = key;   //插入当前的元素 
		 cout<<"*";
		  for(int i=0;i<n;++i) cout<<data[i]<<' ';
         cout<<endl;
   }
}
//基数排序
typedef struct list  //静态链表结构体类型
{
    int data;
    int next;
}List;
List bucket[10];   //构造十个桶
List d[10];      
int maxbit(int data[],int n)   //计算待排序数组元数的最长的位数
{
    int d=1;
    for(int i=0;i<n;i++)
    {
        int c=1;
        int p=data[i];
        while(p/10)
        {
            p=p/10;
            c++;
        }
        if(c>d)
            d=c;
    }
    return d;
}
void init(int data[],int n)  //清桶的过程,以及将临时的数组放到d【10】数组中
{
       int j=0; 
        for(j=0;j<n;j++)
        {
            bucket[j].next=-1;
            bucket[j].data=j;
        }
        for(j=0;j<n;j++)
        {
          d[j].data=data[j];
          d[j].next=-1;
        }
} 
void SORT::RadioSort(int data[],int n)   //基数排序的过程
{
    
    int p=maxbit(data,n);   //先求出最长的位数
    int r=1;
    for(int i=0;i<p;i++)   //执行装桶倒桶的次数
    {
        init(data,n);   //复位清桶的过程
        if(i!=0)   //第一次装桶的时候从小到大开始装,之后都从大到小装桶
        {    
            for(int k=n-1;k>=0;k--)
            {
                int a=d[k].data/r;
                int b=a%10;
                d[k].next=bucket[b].next;
                bucket[b].next=k;
            }
        }
        else
        {
            for(int k=0;k<n;k++)
            {
                int a=d[k].data/r;
                int b=a%10;
                d[k].next=bucket[b].next;
                bucket[b].next=k;
            }
        }
        
        int c=0;
        for(int k=0;k<n;k++)   //倒桶的过程,将其放到data数组当中
        {    
            
            if(bucket[k].next!=-1)
            {
                int p=bucket[k].next;
                data[c++]=d[p].data;
                while(d[p].next!=-1){
                        data[c++]=d[d[p].next].data;
                        p=d[p].next;
                }
            }
              cout<<"*"; 
               for(i=0;i<n;++i) cout<<data[i]<<' ';
               cout<<endl; 
        }
        r=r*10;  //为了后面对十位数以及高位求当前位置上的数字
    }
}
//快速排序 
void SORT::QuickSort(int data[], int left ,int right)  
{  
   
    if(left<right)  
    {  
    int i = left;  
    int j = right;  
    int x = data[i];  
  
    while(i<j)  
    {  
        while(i<j&&data[j]>x)  
            j--;  
        if(i<j){  
            data[i] = data[j];  
            i++;  
        }  
        while(i<j&&data[i]<x)  
            i++;  
        if(i<j){  
         data[j] = data[i];  
         j--;  
        }  
    }  
    data[i] = x;  
    QuickSort(data, left, i-1);  
    QuickSort(data, i+1, right);  
    }  
}  
//归并排序 
void SORT::MergSort(int data[],int first,int mid,int last,int temp[])
{
    int i=first;
    int j=mid;
    int count=0;
    while(1)
    {
        if(data[i]<data[j])
        {
            temp[count++]=data[i++];
        }
        else
        {
            temp[count++]=data[j++];
        }
        if(i==mid)
        {
            while(j<last)
                temp[count++]=data[j++];
            break;
        }
        if(j==last)
        {
            while(i<mid)
                temp[count++]=data[i];
            break;
        }
    }
    for(int k=0;k<count;k++)
    {
        data[first+k]=temp[k];
    }
 
}
void SORT::Merge(int data[],int first,int last,int temp[])  //将两个有序数列合并 
{
    if(last>first)
    {
        int mid=(first+last)/2;
        Merge(data,first,mid,temp); //左边有序 
        Merge(data,mid+1,last,temp); //右边有序 
        MergSort(data,first,mid,last,temp);// 将两个有序数列合并 
    }
 
}
 int main()
{
	 SORT h;
     int n = 8 ;
     int data[]={2,3,8,6,4,1,7,9};	
     int i,ch;
     cout<<"原数组为:";
     for(i=0;i<n;++i) cout<<data[i]<<' ';
     cout<<endl;
     cout<<"请选择进行排序的方式:"<<endl;
	 cout<<"1.插入排序"<<endl;
	 cout<<"2.冒泡排序"<<endl;
	 cout<<"3.选择排序"<<endl;
	 cout<<"4.基数排序"<<endl;
	 cout<<"5.快速排序"<<endl;
     cout<<"6.归并排序"<<endl; 
	 cin>>ch;
	 for(;;)
{
	if(ch==1)
	 		{ 
	 		   h.InsertSort(data, n); 
               cout<<"排列后的数组为:";
               for(i=0;i<n;++i) cout<<data[i]<<' ';
               cout<<endl;  
			 }
		
	if(ch==2)
			{
				h.BubbleSort(data, n);
				cout<<"排列后的数组为:";
               for(i=0;i<n;++i) cout<<data[i]<<' ';
               cout<<endl;  
			}
	if(ch==3)
			{
				h.SelectSort(data, n);
					cout<<"排列后的数组为:";
               for(i=0;i<n;++i) cout<<data[i]<<' ';
               cout<<endl; 
			}
		if(ch==4)
			{
				h.RadioSort(data ,n);
					cout<<"排列后的数组为:";
               for(i=0;i<n;++i) cout<<data[i]<<' ';
               cout<<endl; 
			}
		if(ch==5)
			{
				h.QuickSort(data,0,n-1);
					cout<<"排列后的数组为:";
               for(i=0;i<n;++i) cout<<data[i]<<' ';
               cout<<endl; 
			}
		if(ch==6)
			{
               int last=sizeof(data)/sizeof(int);
             int* p =new int[last]();
             h.Merge(data,0,last,p);
				 for(i=0;i<n;++i) cout<<data[i]<<' ';
               cout<<endl; 
			}
			cout<<"还想再试一次吗?"<<endl;
			cout<<"如果是 请输入1"<<"  "<<"不是 请输入2"<<endl;
			int answer;
			cin>>answer;
		  if(answer==2) break;
}
	  return 0;
}

运行结果截图:




	

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值