任务内容
基于一个顺序表,实现如下排序算法:
- 直接插入排序;
- 交换排序 (冒泡);
- 简单选择排序
代码实现
#include<iostream>
#include<string>
using namespace std;
#define keytype int
typedef struct{
keytype key;
}datatype;
//简单选择排序
void Select_sort(datatype R[],int n)
{
int i,j,k;
for(i=0;i<=n-1;i++)
{
k=i;
for(j=i+1;j<n;j++)
{
if(R[j].key<R[k].key)
{
k=j;
}
}
if(i!=k)
{
swap(R[i],R[k]);
}
}
}
//直接插入排序
void DInsert_sort(datatype R[],int n)
{
int i,j;
for(i=2;i<=n;i++)
if(R[i].key<R[i-1].key)
{
R[0]=R[i];
for(j=i-1;R[0].key<R[j].key;j--)
{ R[j+1]=R[j]; //后移
}
R[j+1]=R[0];
}
}
//冒泡排序
void Bubble_sort(datatype R[],int n)
{
int i,j,s;
for(i=0;i<n-1;i++)
{
s=0;
for(j=n-1;j>i;j--)
if(R[j].key>R[j-1].key)
{
swap(R[j-1],R[j]);
s=1;
}
if(s==0)break;
}
}
void Display(datatype R[],int lengh,int i)//遍历打印函数
{
for(i;i<lengh;i++)
{
printf("%5d",R[i]);
}
cout<<endl;
}
int main()
{
datatype arr3[]={0,9,8,7,6,5};//R[0]为监视哨,不是要排序的关键码 ,打印也从R[1]开始
//但是R[0]也需要传值进去,不然排序后输出会越界
int len3=(int)sizeof(arr3)/sizeof(*arr3);
cout<<"原顺序表 :";
Display(arr3,len3,1);
cout<<"直接插入排序后:";
DInsert_sort(arr3,len3);
Display(arr3,len3,1);
cout<<"------------------------------"<<endl;
datatype arr[]={4,7,3,8,2};
int len=(int)sizeof(arr)/sizeof(*arr);
cout<<"原顺序表 :";
Display(arr,len,0);
cout<<"冒泡排序后: ";//结果是反序的需要逆序打印
Bubble_sort(arr,len);
for(int i=len-1;i>=0;i--)
{
printf("%5d",arr[i]);
}
cout<<endl;
cout<<"------------------------------"<<endl;
datatype arr2[]={1,9,3,4,7};
int len2=(int)sizeof(arr2)/sizeof(*arr2);
cout<<"原顺序表 :";
Display(arr2,len2,0);
cout<<"简单选择排序后:";
Select_sort(arr2,len2);
Display(arr2,len2,0);
return 0;
}