不吹不黑,这几种排序算法真的挺重要的,数据结构这门课程也是很重要的!!!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;
}
运行结果截图: