用指针实现冒泡排序

2024-01-01 16:23:30

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

#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知识进行再次的回顾。

文章来源:https://blog.csdn.net/qq_63074244/article/details/135314592
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。