数据结构
#include <stdio.h>
#include <Windows.h>
//两层循环实现数组排序
void bubble1(int *arr,int length);
//递归实现数组排序
//arr为数组的首地址,length为数组的长度
void bubble2(int * arr,int length);
void main()
{
int i;
int length;
int arr[]={44,3,38,5,47,15,36,26,27,2,46,4,19,50,48};
int arr1[]={44,3,38,5,47,15,36,26,27,2,46,4,19,50,48};
length=sizeof(arr)/sizeof(arr[0]);//求数组的长度来传参
bubble1(arr,length);
printf("数组长度为:\n");
printf("%d \n",length);
for(i=0;i<length;i++)
{
printf("%d ",arr[i]);
}
printf("\n");
printf("排序完成\n");
printf("打印排序前数组\n");
for(i=0;i<length;i++)
{
printf("%d ",arr1[i]);
}
printf("\n");
printf("打印数组长度 : %d\n",sizeof(arr1)/sizeof(int));
bubble2(arr1,length);
printf("打印排序完成的数组\n");
for(i=0;i<length;i++)
{
printf("%d ",arr1[i]);
}
printf("\n");
system("pause");
}
//两层循环实现数组排序
void bubble1(int *arr,int length)
{
int i;
int j;
int tem;
int ifswap=0;
if(length<2) return;
//数组长度小于2的不需要排序
for(i=length-1;i>0;i--)
{
printf("i=%d\n",i);
//初始化交换变量
ifswap=0;
for(j=0;j<i;j++)
{
if(arr[j]<arr[j+1])
{
tem=arr[j];
arr[j]=arr[j+1];
arr[j+1]=tem;
ifswap=1;//进入了交换情况,交换位置置1
}
}//这里引入的ifswap变量目的就是在遍历当前数字后发现没有可交换的数值,说明不需要再比较了
//下面的递归用法优化原理是一样的
//这样就是说如果剩下的已经排序完成就早早的结束函数
if(ifswap==0){printf("排序完成,当前i=%d\n",i); return ;}
}
}
//递归实现数组排序
//arr为数组的首地址,length为数组的长度
void bubble2(int * arr,int length)
{
int i;
int tem;//中间变量,用来实现两元素交换位置
int ifswap=0;
if(length<2){printf("数组长度小于2,不需要排序"); return ;}//这个情况就是递归调用跳出来的条件
//初始化交换变量
ifswap=0;
for(i=0;i<length-1;i++)//i不会遍历到数组的最后位置元素,但是i+1可以
{
if(arr[i]<arr[i+1])
{
tem=arr[i];
arr[i]=arr[i+1];
arr[i+1]=tem;
ifswap=1;//进入了交换情况,交换位置置1
}
}//通过这个循环可以将length的长度数组的最后一位数据排序完成
if(ifswap==0){printf("排序完成,当前length=%d\n",length); return ;}
bubble2(arr,length-1);
}