今天,让我们来学习一下C语言中一个简单的排序算法------冒泡排序。
什么是冒泡排序呢?
冒泡排序是C语言中一个可以将一个数组的内容按照升序或者降序进行重新排列的算法。简单来说,是一种排序的思维。
冒泡排序的核心思想:让同一个数组中相邻的两个元素进行比较。
那下面我们来详细了解一下冒泡排序。
int arr[10]={9,8,7,6,5,4,3,2,1,0};
如上代码,我们设置了一个降序的数组,要将其变为升序。
那么要怎么做呢?
我们让数组里面相邻的两个元素进行比较,如果前面元素的值大于后面元素的值,那么就将它们两个的值进行交换,直到前面的数小于后面的数。
如上图,我们一直将9于其相邻的元素进行比较,知道9前面的元素都比其小。因此,当所有元素都要排序时,除了最后进行冒泡排序的之外的元素,其他的元素都要进行这样的操作。因此,我们通过这个知道要用循环了,也就是进行冒泡排序的趟数。由上面的分析可知,趟数=数组大小 - 1.
for(i=0;i<sz-1;i++)
{
......
}
当我们确定了趟数之后,我们清楚一趟冒泡排序排一个元素,当我们当我们排序9时,要与相邻的元素就行比较9次,当我们把9排序完,进行第二趟冒泡排序,排序8时,要与相邻的元素进行8次比较。所以,我们得出一个条件 每一趟要进行排序的次数 为 sz-1-i (i为第几趟)
得出代码结构
for(i=0;i<sz;i++)
{
for(j=0;j<sz-1-i;j++) //一趟要比较的次数
{
}
}
完整代码
void bubble_sort(int arr[], int sz)//参数接收数组元素个数
{
int i = 0;
for(i=0; i<sz-1; i++)
{
int j = 0;
for(j=0; j<sz-i-1; j++)
{
if(arr[j] > arr[j+1])
{
int tmp = arr[j];
arr[j] = arr[j+1];
arr[j+1] = tmp;
}
}
}
}
int main()
{
int arr[] = {3,1,7,5,8,9,0,2,4,6};
int sz = sizeof(arr)/sizeof(arr[0]);
bubble_sort(arr, sz);
for(i=0; i<sz; i++)
{
printf("%d ", arr[i]);
}
return 0;
}
缺点
上述方法也有一个缺陷,也就是当数组为 9,1,2,3,4,5,6,7,8 的这种情况时,明明只要排序一个9进行了,但是上面的代码还是会一个个进行冒泡排序,这样就会浪费时间。
所以,我们可以进行一下优化
void bubble_sort(int arr[], int sz)//参数接收数组元素个数
{
int i = 0;
for(i=0; i<sz-1; i++)
{
int flag = 1;//假设这⼀趟已经有序了
int j = 0;
for(j=0; j<sz-i-1; j++)
{
if(arr[j] > arr[j+1])
{
flag = 0;//发⽣交换就说明,⽆序
int tmp = arr[j];
arr[j] = arr[j+1];
arr[j+1] = tmp;
}
}
if(flag == 1)//这⼀趟没交换就说明已经有序,后续⽆序排序了
break;
}
}
int main()
{
int arr[] = {3,1,7,5,8,9,0,2,4,6};
int sz = sizeof(arr)/sizeof(arr[0]);
bubble_sort(arr, sz);
for(i=0; i<sz; i++)
{
printf("%d ", arr[i]);
}
return 0;
}
以上就是我对冒泡排序的理解。谢谢观看。