C语言写排序算法(一) —— 冒泡排序
发现学习C语言这么久了,还没有把各种排序算法理一遍,今天开始第一个排序算法,最容易理解的冒泡排序。
直接上代码:
void bubble_sort(int arr[], int n)
{
int i, j;
int tmp;
for (i = 0; i < n; i++) {
for (j = 0; j < n - i - 1; j++) {
if (arr[j] > arr[j + 1])
{
tmp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = tmp;
}
}
}
}
测试代码:
void bubble_sort(int arr[], int n);
int main()
{
int arr[] = { 8, 6, 23, 2, 17, 36 };
int N = sizeof(arr) / sizeof(int), i = 0;
for (i = 0; i < N; ++i) {
printf("%d ", arr[i]);
}
printf("\n");
bubble_sort(arr, N);
for (i = 0; i < N; ++i) {
printf("%d ", arr[i]);
}
printf("\n");
return 0;
}
执行结果:
排序原理:
上图是外层i循环的第一个循环过程,可以看到, 这个过程执行完成之后,会将最大的数放到数组的最后面,这就是冒泡的意思,将本轮最大的(或最小)移动到数组的最后,每个子循环从0开始,到 n - i - 1 结束,i的意思是已经冒出多少个泡了,-1 的意思是 因为判断 arr[j] 和 arr [j + 1]。
所以当执行数组元素个数次外层循环之后,就可以将数组排好序了。
但是冒泡排序的时间复杂度有点高,因为他用到了两个循环,而且大家从过程中也可以看出,有很多无效的判断(本来已经是左小右大,还是要执行判断)。
今天就先到这里吧,如果感觉有用的话希望你可以分享给自己的同学、伙伴。谢谢你啦。
-------------------------------------------------------------------------