提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
#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
通过对数数组的地址进行传入到函数,进而对数组里面的元素进行“打擂台”,注意点数组的首元素就是数组的首地址。
代码如下:
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]);
}
代码如下(示例):
?int flag=1;//对有序进行标志???
//下面对条件满足时进行的跳出
? if(flag==1) //进行判断?
?? ??? ?{
?? ??? ??? ?break ;//若此时有序直接跳出?
?? ??? ?}
当遇到数组如:{1,2,3,4,5,6,7,8,9,10}这种已经升序完毕的数组,如果还进行依次遍历比较会消耗运行时间,所以进行这个一步的优化,这一步起到判断作用。
提示:
通过这个代码,我们可以对数组、函数、指针的知识进行较好的结合,同时我们也对break与continue知识进行再次的回顾。