对于一个有n个元素数组,我们要对其进行排序,原理是让数组从第一个元素开始,依次和后面的元素进行比较,如果前一个元素大于后一个元素,则实行交换,每进行一轮这样的排序,都会有一个最大的元素到数组的最后。比如:i=0时,内存循环一趟后,这n个元素中最大的那个元素就会排列在最后的位置,再进行下一次比较时,只需要比较剩下的n-1个元素,依次类推,直到剩下2个元素,比较最后一次,整个数组就实现了从小到大的升序排列。
这里我们用两层for循环,外层循环表示排序的次数,对于n个元素,我们只需要按这样的循环(数组从第一个元素开始,依次和后面的元素进行比较,如果前一个元素大于后一个元素,则实行交换)n-1次,就可以实现排序;内层循环用于元素的比较、交换,对于范围,由于外层循环进行一次,便会有一个相对最大的数被排列在后面,因此内层循环的j<length-i-1;
void bubblesort(int arr[], int length)
{
for (int i = 0; i < length - 1; i++)
{
int flag = 0;//记录这一轮会不会有数据交换
for (int j = 0; j < length - i - 1; j++)
{
if (arr[j + 1] < arr[j])
{
int temp;
temp = arr[j + 1];
arr[j + 1] = arr[j];
arr[j] = temp;
flag = 1;
}
}
if (flag == 0)
{
break;
}
}
for (int k = 0; k < length; k++)
{
printf("a[%d]=%d\n", k, arr[k]);
}
}
同时我们可以优化一下代码,定义一个flag,用于判断数组是否已经按照升序排列,若是,不会进入到if语句,直接跳出外层for循环,减少消耗。
第一次写这个,可能理解不到位,上面只是自己的理解,有什么需要改进的地方,希望能够提出来。