用指针实现冒泡排序

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

#include<stdio.h>
int main() { //指针进行冒泡排序
	int size;
	int arr[]= {1,4,5,6,9,2,7,8,3,10};

	size=sizeof(arr)/sizeof(arr[0]);
	fun(arr,size);
	p(arr,size);
	return 0;
}
void fun(int*arr,int n) {
	int i,j,t;

	for(i=0; i<n-1; i++) //比较次数 
	{
		int flag=1;//对有序进行标志 
			for(j=0; j<n-1-i; j++) //每内循环比较的次数 
			{
				if(arr[j]>arr[j+1])
				 {
					t=arr[j+1];
					arr[j+1]=arr[j];
					arr[j]=t;
					flag=0;//说明此时还是无序的 
				} 
			}
			if(flag==1) //进行判断 
		{
			break ;//若此时有序直接跳出 
		}

	}

}
void p(int *arr,int sz) {
	int i=0;
	for(i=0; i<sz; i++)
		printf("%d ",arr[i]);
}

文章目录


前言

提示:这里可以添加本文要记录的大概内容

在C语言的应用中,数组的排血较为普遍。常见的排序如,冒泡排序、选择排序等。下面我们介绍一下如何通过指针实现冒泡排序。


提示:以下是本篇文章正文内容,下面案例可供参考

一、冒泡排序底层算法

冒泡排序的本质就是“打擂台”进行遍历实现数组元素的排序,那么如何进行编写其实分为两步。

1:外层要循环的次数

        注意:外部循环时,十个元素就只需要进行9次循环,因此外部的判断条件为 n-1

2:内层依次进行比较的次数

        注意:内部循环时进行比较时,因为每次比较出结果后都会有i个元素不再进行比较了(比较完后已经排序好的元素将不在进行后续的比较),所以内部判断条件为n-i-1

二、使用步骤

1.指针的应用

通过对数数组的地址进行传入到函数,进而对数组里面的元素进行“打擂台”,注意点数组的首元素就是数组的首地址。

2.函数部分的编写

代码如下:

void fun(int*arr,int n) {
    int i,j,t;

    for(i=0; i<n-1; i++) //比较次数 
    {
        int flag=1;//对有序进行标志 
            for(j=0; j<n-1-i; j++) //每内循环比较的次数 
            {
                if(arr[j]>arr[j+1])
                 {
                    t=arr[j+1];
                    arr[j+1]=arr[j];
                    arr[j]=t;
                    flag=0;//说明此时还是无序的 
                } 
            }
            if(flag==1) //进行判断 
        {
            break ;//若此时有序直接跳出 
        }

    }

}
void p(int *arr,int sz) {
    int i=0;
    for(i=0; i<sz; i++)
        printf("%d ",arr[i]);
}

3.代码优化部分

代码如下(示例):

 int flag=1;//对有序进行标志   
//下面对条件满足时进行的跳出
  if(flag==1) //进行判断 
        {
            break ;//若此时有序直接跳出 
        }

当遇到数组如:{1,2,3,4,5,6,7,8,9,10}这种已经升序完毕的数组,如果还进行依次遍历比较会消耗运行时间,所以进行这个一步的优化,这一步起到判断作用。


总结

提示:

通过这个代码,我们可以对数组、函数、指针的知识进行较好的结合,同时我们也对break与continue知识进行再次的回顾。

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值