C语言,冒泡排序

#include 
//冒泡排序
void swap(int* px, int* py)//设计函数进行arr[j]和arr[j+1]的交换。
{
	int z = 0;
	z = *px;
	*px = *py;
	*py = z;
}
void maopao(int arr[],int sz)//设计函数进行冒泡排序。
{
	
	int j = 0;
	int i = 0;
	while (i < sz - 1)
	{
		for (j = 0; j < sz - 1 - i; j++)//sz - 1 - i的原因是每一趟排序都已经完成了一个数的排序,就会少一个数字需要进行下一轮比较。
		{
			if (arr[j] > arr[j + 1])
			{
				swap(&arr[j],&arr[j + 1]);//传址调用。
			}
		}
		i++;
	}
}
int main()
{
	int arr[10] = { 0};
	int a = 0;
	for (a = 0; a < 10; a++)
	{
		scanf("%d", &arr[a]);
	}
	int sz = sizeof(arr) / sizeof(arr[0]);
	maopao(arr,sz);
	int i = 0;
	for (i = 0; i < sz; i++)
	{
		printf("%d ", arr[i]);
	}
	return 0;
}

1.同二分查找的函数一样,sz的存储不能放在函数之中,因为arr是将首元素地址传到函数里面去了,此时函数内arr指的是arr中首元素的地址,应该将主函数中的sz通过传参传到函数里面。

2.因为冒泡排序每跑一趟,就有一个元素完成了排序,所以maopao函数中for循环中的判断条件的值也要每跑一趟就减一,而每跑一趟,i的值都会加1,初始i为0,可以将for的判断条件写为j < sz - 1 - i 。

3.要是arr[ j ]的值大于arr[ j+1 ]的值,则要将二者交换,所以可以再设计一个swap交换函数来完成交换的工作。

你可能感兴趣的:(c语言)