/**
以下程序是本人根据一些算法思想,在visual c++6.0上的实现,由于本人在算法方面不是很擅长,如果您发现程序中的错误,或有更好的
实现策略,希望不吝赐教!!
*/
/**
堆排序:数组中下标从1开始
*/
#include<iostream>
using namespace std;
void sift(int a[],int root,int end)
{
int temp=root;
int j=root*2;
int k=a[root];
bool finished=false;
bool update=false;//判断数据是否需要替换
while(j<=end && !finished)
{
if(j<end && a[j]>a[j+1]) j++;
if(k<=a[j])
{
finished=true;
j/=2;//子节点符合条件是表明应替换其父节点
}
else
{
update=true;
a[temp]=a[j];
temp=j;
if(j*2>end)//数组下标越界,说明该节点是叶子节点,直接替换
break;
else
j*=2;
}
}
if(update)
a[j]=k;
for(int p=1;p<=end;p++)//每次堆重组之后的结果
cout<<a[p]<<" ";
cout<<endl;
}
void crtheap(int a[],int length)
{
for(int i=length/2;i>=1;i--)
{
sift(a,i,length);
}
}
void HeapSort(int a[],int length)
{
cout<<"开始构建堆"<<endl;
crtheap(a,length);
cout<<"初始堆构建完成"<<endl;
for(int j=length;j>=2;j--)
{
cout<<"排序的第"<<length-j+1<<"个数为:"<<a[1]<<endl;
a[1]=a[j];
sift(a,1,j-1);
}
cout<<"排序的最后一个数为:"<<a[1]<<endl;
}
void main()
{
int a[]={0,5,9,3,6,7,8,1};
cout<<"排序原始数据为:";
for(int p=1;p<=7;p++)
cout<<a[p]<<" ";
cout<<endl;
HeapSort(a,7);
}
/**
归并排序
*/
#include<iostream>
using namespace std;
void init(int a[])
{
for(int j=0;j<4;j++)
a[j]=0;
}
void merg(int a[],int b[],int i,int m,int n)//将数组a中数据排序归并到数组b中
{
int j,k,temp;
temp=i;
for(j=m+1,k=i;i<=m && j<=n;k++)
{
if(a[i]<a[j]) b[k]=a[i++];
else b[k]=a[j++];
}
while(i<=m) b[k++]=a[i++];
while(j<=n) b[k++]=a[j++];
}
void gb(int a[],int b[],int s,int n)
{
int c[4];
if(s==n) b[s]=a[s];
else
{
int m=(s+n)/2;
gb(a,c,s,m);
gb(a,c,m+1,n);
merg(c,b,s,m,n);
}
}
void main()
{
int a[]={5,8,7,3};
int b[4];
init(b);
gb(a,b,0,3);
for(int i=0;i<4;i++)
cout<<b[i]<<" ";
}
/**
Fun:基数排序
*/
#include<iostream>
using namespace std;
int num[8]={21,80,62,96,71,11,20,32};
typedef struct //队列
{
int nums[8];
int top;
}Line;
Line *lines[10];//基数是10 即0-9 数组下标代表其关键字
void init()
{
for(int i=0;i<=9;i++)//分配空间
{
(lines[i])=(Line *)malloc(sizeof(Line));
lines[i]->top=0;
}
}
void sort()//按照个位分配不同队列
{
int i;
for(i=0;i<8;i++)
{
int temp=num[i]%10;//取出关键字
lines[temp]->nums[lines[temp]->top]=num[i];//入队
lines[temp]->top++;//队列头加1
}
}
void sort1()//按照十位分配不同队列
{
int i;
for(i=0;i<8;i++)
{
int temp=(num[i]/10)%10;
lines[temp]->nums[lines[temp]->top]=num[i];
lines[temp]->top++;
}
}
void gather()//将非空队列中的数据整合
{
int i,j;
int port=0;//目标数组下标
for(j=0;j<10;j++)
{
for(i=0;i<lines[j]->top;i++)//从所有队列中获取数据
{
num[port]=lines[j]->nums[i];//出队
port++;//下标加1
lines[j]->top--;//队列都减一
}
}
}
void main()
{
init();
sort();//第一次按个位分装到各队列
gather();//收集
sort1();//第二次按十位分装到各队列
gather();//收集
for(int k=0;k<8;k++)//输出目标数据
cout<<num[k]<<" ";
for(int i=0;i<10;i++)//释放空间
free(lines[i]);
}
/*
快速排序 空间复杂度 O(log2(n)) 时间复杂度 最坏O(n^2) 最好O(nlog2(n))
*/
#include<iostream>
using namespace std;
int getpoint(int a[],int start,int end)
{
int temp=a[start];
int low=start,high=end;
bool fromHead=false;
while(low!=high)
{
if(!fromHead)
{
if(temp>a[high])
{
a[low]=a[high];
low++;
fromHead=true;
}
else
high--;
}
else
{
if(temp<a[low])
{
a[high]=a[low];
high--;
fromHead=false;
}
else
low++;
}
}
a[low]=temp;
return low;
}
void fastsort(int a[],int start,int end)
{
if(start!=end && end>start)
{
int temp=getpoint(a,start,end);
fastsort(a,start,temp-1);
fastsort(a,temp+1,end);
}
else
return;
}
void main()
{
int a[6]={1,5,9,2,7,3};
fastsort(a,0,5);
for(int i=0;i<6;i++)
cout<<a[i]<<" ";
}
先进排序方式的实现
最新推荐文章于 2021-11-08 11:37:31 发布