排序
来源:互联网 发布:淘宝上正品stussy店 编辑:程序博客网 时间:2024/05/01 10:46
: 个人日记 举报
#define N 10
#include<stdio.h>
void select_sort(int *A);//选择排序
void bubble_sort(int *A);//冒泡排序
void exchange_sort(int *A);//交换排序
void shell_sort(int *A);//谢尔排序
void swap(int &value1,int &value2);//实现两个数值的交换
void insert_sort(int *A);//插入排序
void insert(int *A,int k);//将一个新元素k插入到已经排好序的数组中
void radix_sort(int *A);//基数排序
int maxNumber(int *A);//传回数组中最大的整数
int maxdigit(int no);//传回整数的位数,0代表1位数,1代表2位数——
int digitk(int no,int kth);//传回第k位数字
void quick_sort(int *A,int left,int right);//快速排序算法
void merge_sort(int *A,int left,int right);//归并排序算法
//将两个数列归并成新的数列
void merge(int *A1,int A1_start,int *A2,int A2_start,int A2_end,int *A3,int A3_start,int A3_end);
void main()
{
int i=0;
int k;
int A[]={37,20,15,40,50,60,32,80,78,100};
printf("Data before sorting:");
for(i=0;i<N;i++)
{
if(i%6==0)
printf("/n A[%d]=%4d ",i,A);
else
printf("A[%d]=%4d ",i,A);
}
printf("/n");
//调用各种排序方法,择其一
//select_sort(A);//调用选择排序
//insert_sort(A);//调用插入排序
//shell_sort(A);//调用谢尔排序
//radix_sort(A);//调用基数排序
quick_sort(A,0,N-1); 调用快速排序
// merge_sort(A,0,N-1);//调用归并排序
printf("Data after sorting:");
for(i=0;i<N;i++)
{
if(i%6==0)
printf("/n A[%d]=%4d ",i,A);
else
printf("A[%d]=%4d ",i,A);
}
printf("/n");
printf("Please input k inserting number:");
scanf("%d",&k);
insert(A,k);
printf("Data after inserting:");
for(i=0;i<=N;i++)
{
if(i%6==0)
printf("/n A[%d]=%4d ",i,A);
else
printf("A[%d]=%4d ",i,A);
}
printf("/n");
}
void insert_sort(int *A)//插入排序函数的实现
{
int i,j,x;
for(i=1;i<N;i++)
{
x=A;
j=i-1;
while(j>=0&&A[j]>x)
{
A[j+1]=A[j];
j--;
}
A[j+1]=x;
}
}
void insert(int *A,int k)//将新元素k插入数组A中的函数的实现
{
int i;
if(k>=A[N-1]) A[N]=k;
else
{
i=N-1;
k=A;
while(i>=0&&A>k)
{
A=A;A=k;
--i;
}
}
}
void select_sort(int *A)//选择排序函数的实现
{
int i,j,small;
for(i=0;i<N-1;i++)
{
small=i;
for(j=i+1;j<N;j++)
if(A[small]>A[j])
small=j;
swap(A,A[small]);
}
}
void bubble_sort(int *A)
{
int i,j,xflag=0;
for(i=0;(i<=N-2)&&(xflag==0);i++)
{
xflag=1;
for(j=0;j<N-i-2;j++)
{
if(A[j]>A[j+1])
{
swap(A[j],A[j+1]);
xflag=0;
}
}
}
}
void exchange_sort(int *A)//交换排序算法的实现
{
int i,j;
for(i=0;i<=N-2;i++)
for(j=i+1;j<=N-1;j++)
if(A>A[j])
swap(A,A[j]);
}
void swap(int &value1,int &value2)//交换两个数值的函数的实现
{
int temp;
temp=value2;
value2=value1;
value1=temp;
}
void shell_sort(int *A)//谢尔排序算法的实现
{
int i,j,x,hcount,hgroup;
for(hcount=2;hcount<(N/2);hcount=hcount*2)
{
for(hgroup=1;hgroup<=hcount-1;hgroup++)
{
//插入排序
for(i=hgroup;i<=N-1;i+=hcount)
{
x=A;
j=i-hcount;
while(j>=0&&A[j]>x)
{
A[j+hcount]=A[j];
j-=hcount;
}
A[j+hcount]=x;
}
}
}
insert_sort(A);//最后调用插入排序算法
/* for(i=1;i<=N-1;i++)
{
x=A;
j=i-1;
while(j>=0&&A[j]>x)
{
A[j+1]=A[j];
j--;
}
A[j+1]=x;
}*/
}
void radix_sort(int *A)
{
int i,j,k,index,no;
int maxno;
int digitno;
int nocount[10]={0,0,0,0,0,0,0,0,0,0};
int noarray[10][N];
maxno=maxNumber(A);
digitno=maxdigit(maxno);
for(i=0;i<=2;i++)
{
for(j=0;j<=9;j++)
nocount[j]=0;
for(j=0;j<=N-1;j++)
{
no=digitk(A[j],i);
noarray[no][nocount[no]]=A[j];
nocount[no]=nocount[no]+1;
}
index=0;
for(j=0;j<=9;j++)
{
for(k=0;k<nocount[j];k++)
{
A[index]=noarray[j][k];
index++;
}
}
}
}
int maxNumber(int *A)//传回数组中最大的整数
{
int j,max=0;
for(j=0;j<N;j++)
if(A[j]>=max)
max=A[j];
return max;
}
int maxdigit(int no)//传回整数的位数
{
int j;
for(j=0;;j++)
{
no=(int)(no/10);
if(no<1)
return j;
}
}
int digitk(int no,int kth)//传回第k位数字
{
int i,j,m;
if(kth==0)
return no%10;
else
{
for(j=0;j<kth;j++)
{
if(j==0)
m=10;
else
m=m*10;
}
i=((int)(no/m))%10;
return i;
}
}
void quick_sort(int *A,int left,int right)
{
int low,upper,point;
if(left<right)
{
point=A[left];
low=left;
upper=right+1;
while(1)
{
while(A[++low]<point);//向右找
while(A[--upper]>point);//向左找
if(low>=upper)
break;
swap(A[low],A[upper]);
}
A[left]=A[upper];
A[upper]=point;
quick_sort(A,left,upper-1);
quick_sort(A,upper+1,right);
}
}
void merge_sort(int *A,int left,int right)
{
int half;
if(left<right)
{
half=(left+right)/2;
merge_sort(A,left,half);
merge_sort(A,half+1,right);
merge(A,left,A,left,half,A,half+1,right);
}
}
void merge(int *A1,int A1_start,int *A2,int A2_start,int A2_end,int *A3,int A3_start,int A3_end)
{
int i,j,k=0,h;
int B[N];
i=A2_start;
j=A3_start;
while(i<=A2_end&&j<=A3_end)
{
if(A2<=A3[j])
B[k++]=A2;
else
B[k++]=A3[j++];
}
while(i<=A2_end) B[k++]=A2;
while(i<=A3_end) B[k++]=A3;
for(h=0;h<k;h++)
A1[A1_start+h]=B[h];
}
#include<stdio.h>
void select_sort(int *A);//选择排序
void bubble_sort(int *A);//冒泡排序
void exchange_sort(int *A);//交换排序
void shell_sort(int *A);//谢尔排序
void swap(int &value1,int &value2);//实现两个数值的交换
void insert_sort(int *A);//插入排序
void insert(int *A,int k);//将一个新元素k插入到已经排好序的数组中
void radix_sort(int *A);//基数排序
int maxNumber(int *A);//传回数组中最大的整数
int maxdigit(int no);//传回整数的位数,0代表1位数,1代表2位数——
int digitk(int no,int kth);//传回第k位数字
void quick_sort(int *A,int left,int right);//快速排序算法
void merge_sort(int *A,int left,int right);//归并排序算法
//将两个数列归并成新的数列
void merge(int *A1,int A1_start,int *A2,int A2_start,int A2_end,int *A3,int A3_start,int A3_end);
void main()
{
int i=0;
int k;
int A[]={37,20,15,40,50,60,32,80,78,100};
printf("Data before sorting:");
for(i=0;i<N;i++)
{
if(i%6==0)
printf("/n A[%d]=%4d ",i,A);
else
printf("A[%d]=%4d ",i,A);
}
printf("/n");
//调用各种排序方法,择其一
//select_sort(A);//调用选择排序
//insert_sort(A);//调用插入排序
//shell_sort(A);//调用谢尔排序
//radix_sort(A);//调用基数排序
quick_sort(A,0,N-1); 调用快速排序
// merge_sort(A,0,N-1);//调用归并排序
printf("Data after sorting:");
for(i=0;i<N;i++)
{
if(i%6==0)
printf("/n A[%d]=%4d ",i,A);
else
printf("A[%d]=%4d ",i,A);
}
printf("/n");
printf("Please input k inserting number:");
scanf("%d",&k);
insert(A,k);
printf("Data after inserting:");
for(i=0;i<=N;i++)
{
if(i%6==0)
printf("/n A[%d]=%4d ",i,A);
else
printf("A[%d]=%4d ",i,A);
}
printf("/n");
}
void insert_sort(int *A)//插入排序函数的实现
{
int i,j,x;
for(i=1;i<N;i++)
{
x=A;
j=i-1;
while(j>=0&&A[j]>x)
{
A[j+1]=A[j];
j--;
}
A[j+1]=x;
}
}
void insert(int *A,int k)//将新元素k插入数组A中的函数的实现
{
int i;
if(k>=A[N-1]) A[N]=k;
else
{
i=N-1;
k=A;
while(i>=0&&A>k)
{
A=A;A=k;
--i;
}
}
}
void select_sort(int *A)//选择排序函数的实现
{
int i,j,small;
for(i=0;i<N-1;i++)
{
small=i;
for(j=i+1;j<N;j++)
if(A[small]>A[j])
small=j;
swap(A,A[small]);
}
}
void bubble_sort(int *A)
{
int i,j,xflag=0;
for(i=0;(i<=N-2)&&(xflag==0);i++)
{
xflag=1;
for(j=0;j<N-i-2;j++)
{
if(A[j]>A[j+1])
{
swap(A[j],A[j+1]);
xflag=0;
}
}
}
}
void exchange_sort(int *A)//交换排序算法的实现
{
int i,j;
for(i=0;i<=N-2;i++)
for(j=i+1;j<=N-1;j++)
if(A>A[j])
swap(A,A[j]);
}
void swap(int &value1,int &value2)//交换两个数值的函数的实现
{
int temp;
temp=value2;
value2=value1;
value1=temp;
}
void shell_sort(int *A)//谢尔排序算法的实现
{
int i,j,x,hcount,hgroup;
for(hcount=2;hcount<(N/2);hcount=hcount*2)
{
for(hgroup=1;hgroup<=hcount-1;hgroup++)
{
//插入排序
for(i=hgroup;i<=N-1;i+=hcount)
{
x=A;
j=i-hcount;
while(j>=0&&A[j]>x)
{
A[j+hcount]=A[j];
j-=hcount;
}
A[j+hcount]=x;
}
}
}
insert_sort(A);//最后调用插入排序算法
/* for(i=1;i<=N-1;i++)
{
x=A;
j=i-1;
while(j>=0&&A[j]>x)
{
A[j+1]=A[j];
j--;
}
A[j+1]=x;
}*/
}
void radix_sort(int *A)
{
int i,j,k,index,no;
int maxno;
int digitno;
int nocount[10]={0,0,0,0,0,0,0,0,0,0};
int noarray[10][N];
maxno=maxNumber(A);
digitno=maxdigit(maxno);
for(i=0;i<=2;i++)
{
for(j=0;j<=9;j++)
nocount[j]=0;
for(j=0;j<=N-1;j++)
{
no=digitk(A[j],i);
noarray[no][nocount[no]]=A[j];
nocount[no]=nocount[no]+1;
}
index=0;
for(j=0;j<=9;j++)
{
for(k=0;k<nocount[j];k++)
{
A[index]=noarray[j][k];
index++;
}
}
}
}
int maxNumber(int *A)//传回数组中最大的整数
{
int j,max=0;
for(j=0;j<N;j++)
if(A[j]>=max)
max=A[j];
return max;
}
int maxdigit(int no)//传回整数的位数
{
int j;
for(j=0;;j++)
{
no=(int)(no/10);
if(no<1)
return j;
}
}
int digitk(int no,int kth)//传回第k位数字
{
int i,j,m;
if(kth==0)
return no%10;
else
{
for(j=0;j<kth;j++)
{
if(j==0)
m=10;
else
m=m*10;
}
i=((int)(no/m))%10;
return i;
}
}
void quick_sort(int *A,int left,int right)
{
int low,upper,point;
if(left<right)
{
point=A[left];
low=left;
upper=right+1;
while(1)
{
while(A[++low]<point);//向右找
while(A[--upper]>point);//向左找
if(low>=upper)
break;
swap(A[low],A[upper]);
}
A[left]=A[upper];
A[upper]=point;
quick_sort(A,left,upper-1);
quick_sort(A,upper+1,right);
}
}
void merge_sort(int *A,int left,int right)
{
int half;
if(left<right)
{
half=(left+right)/2;
merge_sort(A,left,half);
merge_sort(A,half+1,right);
merge(A,left,A,left,half,A,half+1,right);
}
}
void merge(int *A1,int A1_start,int *A2,int A2_start,int A2_end,int *A3,int A3_start,int A3_end)
{
int i,j,k=0,h;
int B[N];
i=A2_start;
j=A3_start;
while(i<=A2_end&&j<=A3_end)
{
if(A2<=A3[j])
B[k++]=A2;
else
B[k++]=A3[j++];
}
while(i<=A2_end) B[k++]=A2;
while(i<=A3_end) B[k++]=A3;
for(h=0;h<k;h++)
A1[A1_start+h]=B[h];
}