排序是日常生活和工作中都需要的基本操作,尤其是对于计算机来说,排序的效率决定了代码的执行效率,对产品开发起到功不可没的作用!下面让我们来了解排序的最基本方法!
冒泡排序
冒泡排序是我接触的第一种排序算法,下面简单介绍冒泡排序的过程。
随便给出一个乱序的数组,下面我们将通过三种排序算法对同一个数组进行操作。使用size记录数组的元素个数,sizeof(arr)所求的是整个数组的字节数,除以sizeof(int),也就是整型数的字节数,求出元素个数。
下面是冒泡排序的核心思想,如何体现冒泡的过程,换言之,就是冒泡排序为何叫“冒泡排序”,冒泡的过程就体现在数组元素的交换上,就比如我要升序排这个数组,那么大的数字就要从前往后,我们从第一个元素开始,每两个元素之间进行比较,将大的数置换到后面,操作如下。
从第一个元素开始,我们发现arr[0]比arr[1]要小,满足升序条件,于是我们就不需要交换两个数值。当遍历到arr[1]时,我们发现arr[2]比arr[1]要小,对这两个数来说,不满足升序的要求,于是如上图交换两个数。类似的操作,我们遍历一整趟数组,可以发现,数组中最大的元素被移到了的最后 面,就像是几块石头,最重的石头沉得最深。
第一趟排序后,我们就找到了数组中的最大值,在最后一个位置。于是我们通过循环,每一次都同上操作,于是我们实现的过程就是每一趟找到未排序的数字的最大值,并将其排放到他应该在的位置,也就是符合升序要求的位置,数组的元素有十个,那么我们就要循环9趟,每一趟都能将一个值归位,而每一趟循环,我们都需要将每一个数字进行比较,冒泡排序,将不满足升序要求两个数字进行交换。
重复上述操作后,我们发现,在第七趟排序结束后,产生的数组就已经符合升序要求了,这时就可以通过一定的操作跳出循环,避免浪费不必要的时间,下面是我写的源代码,其中count表示的是交换的次数,一定程度上可以表现出算法的复杂程度。
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
//实现冒泡排序
void swap(int* a, int* b)
{
int temp = *a;
*a = *b;
*b = temp;
}
void displayarr(int* arr, int size)
{
printf("the array is:");
for (int i = 0; i < size; i++)
{
printf("%d ", arr[i]);
}
printf("\n");
}
void bubblesort(int* arr, int size)
{
//算法的复杂度为O(n²)
int count = 0;
for (int i = 0; i < size - 1; i++)
{
int flag = 0;
for (int j = 0; j < size - 1 - i; j++)
{
if (arr[j] > arr[j + 1])
{
swap(&arr[j], &arr[j + 1]);
flag = 1;
count++;
}
}
displayarr(arr, size);
if (flag == 0)
{
break;
}
}
printf("%d\n", count);
}
int main()
{
int arr[] = { 4,45,34,5646,234,456,234,56,234,46 };
int size = sizeof(arr) / sizeof(int);
//冒泡排序
printf("----------------------------------\n");
printf("bubblesort:\n");
printf("the first array is:\n");
displayarr(arr, size);
printf("\n");
bubblesort(arr, size);
displayarr(arr, size);
printf("----------------------------------\n");
return 0;
}
本人刚上大一,希望能通过写博客提升自己的能力,感谢大家的支持,我也会不断努力,最后希望如果有不正确的地方可以指出,我会改正。谢谢大家!