一、冒泡排序
思路:
1.首先有两层循环,外层循环是用来进行遍历的
2.内层循环从0开始遍历len-i-1次,-i是为防止与已经排好的元素进行比较,从而导致出错,-1是为了防止溢出
3.使用if进行判断,始终保持从小到大,若相邻两元素不满足此条件,两两进行交换
/*
*函数的参数:int arr[]传入所需要排序的数组, int len 传入数组的长度
*函数的用法:通过两层循环,并两两进行比较,将最大值存储到后方
*函数的结果:得到从小到大已经排序好的数组
*注意事项:1.在传数组时,不能以值形式传参,否则arr输出不改变
* 2.不能再fun函数内进行len的计算,算出的是数组首元素地址的长度
* 3.里层循环条件结束必须len-i-1,i是为了防止和上次循环的最大值比较,1是因为比较时是j和j+1,避免j+1超过数组下标
*/
void fun(int arr[],int len){
for(int i=0;i<len-1;i++){ //第一层循环进行遍历
for(int j=0;j<len-i-1;j++){ //第二层循环进行比较,将最大值往后面放,结束条件为len-i-1为了避免和后面已经存储好的最大值冲突,导致出错
if(arr[j]>arr[j+1]){ //通过比较将最大数存储到后面
int tmp=arr[j]; //两两比较,进行交换
arr[j]=arr[j+1];
arr[j+1]=tmp;
}
}
}
}
int main(){
int arr[]={12,23,1,24,45,56,89,78,54,13};
int len=sizeof(arr)/sizeof(arr[0]); //计算数组长度
fun(arr,len);
for(int i=0;i<len;i++){ //for循环遍历,输出
printf("%d ",arr[i]);
}
}
二、选择排序
思路:
1.首先有两层循环,外层循环是用来进行遍历的
2.内层循环从i开始遍历到len,从i开始是因为通过每次比较将最小的值放入i,避免与上一次的冲突,我们从i开始
3.使用if进行判断,始终保持从小到大,若相邻两元素不满足此条件,使arr[i]与arr[j]进行交换
/*
*函数的参数:int arr[]传入所需要排序的数组, int len 传入数组的长度
*函数的用法:通过两层循环,并进行比较,保证较小数在前,若不满足进行交换
*函数的结果:得到从小到大已经排序好的数组
*注意事项:1.在传数组时,不能以值形式传参,否则arr输出不改变
* 2.不能再fun函数内进行len的计算,算出的是数组首元素地址的长度
* 3.里层循环必须从i开始,避免与已经排好的数组进行冲突
*/
void fun(int arr[],int len)
{
for(int i=0;i<len;i++) //遍历len次
{
for(int j=i;j<len;j++) //从i遍历到len避免与已经排好的发生冲突
{
if(arr[j]<arr[i]) //始终保持i小,若不满足进行交换
{
int tmp=arr[j];
arr[j]=arr[i];
arr[i]=tmp;
}
}
}
}
int main(){
int arr[]={12,23,1,24,45,56,89,78,54,13};
int len=sizeof(arr)/sizeof(arr[0]); //计算数组长度
fun(arr,len);
for(int i=0;i<len;i++){ //for循环遍历,输出
printf("%d ",arr[i]);
}
}
三、插入排序
思路:
1.首先有两层循环,外层循环是用来进行遍历的
2.内层循环从i-1开始,结束条件使>=0,因为数组下标到0故等于0,从i-1开始是我们认为i的左边元素是有序数组,我们将arr[i]与有序数组的元素进行比较(在内层循环开始前,将arr[i]存储起来,防止因为覆盖改变元素导致出错)
3.使用if进行判断,将arr[i]与有序数组元素比较,若有序数组元素大于arr[i],我们进行覆盖,直到找到小于arr[i]的元素,结束跳出循环,跳出循环后进行插入,将arr[j+1]等于arr[i]的值
/*
*函数的参数:int arr[]传入所需要排序的数组, int len 传入数组的长度
*函数的用法:通过两层循环,并进行比较,通过比较,排列有序数组,不满足进行覆盖
*函数的结果:得到从小到大已经排序好的数组
*注意事项:1.在传数组时,不能以值形式传参,否则arr输出不改变
* 2.不能再fun函数内进行len的计算,算出的是数组首元素地址的长度
* 3.外层循环从1开始,使左边为有序数组,里层循环必须从i-1开始,结束>=0将tmp与有序数组比较进行排序,之后进行插入
*/
void fun(int arr[],int len)
{
int j;
for(int i=1;i<len;i++) //将第一个元素作为有序数组,估下标从1开始,进行比较
{
int tmp=arr[i]; //避免因为覆盖导致arr[i]改变,从而使后面插入出错
for(j=i-1;j>=0;j--) //与左边有序数组循环
{
if(arr[j]>tmp) //与左边有序数组进行比较
{
arr[j+1]=arr[j]; //不满足进行覆盖
}
else
break; //满足条件退出循环
}
arr[j+1]=tmp; //进行插入操作
}
}
int main(){
int arr[]={12,23,1,24,45,56,89,78,54,13};
int len=sizeof(arr)/sizeof(arr[0]); //计算数组长度
fun(arr,len);
for(int i=0;i<len;i++){ //for循环遍历,输出
printf("%d ",arr[i]);
}
}