思想:
依次遍历数组确定下来最大的数字放到最后一位,总共需要遍历n趟,确定下来每一趟里面的最大数均放置到末尾。(冒泡也就是:上面的泡泡最小,下面最大)
通俗讲:(两两比较,大的往后走)
思路演绎:
原始数据:9 3 7 8 5 2
一趟排序:3 7 8 5 2 9
两趟排序:3 7 5 2 8 9
三趟排序:3 5 2 7 8 9
四趟排序:3 2 5 7 8 9
五趟排序:2 3 5 7 8 9
代码:
//冒泡排序
void BubbleSort(int* arr, int len)
{
int tmp;
for (int i = 0; i < len - 1; i++)//len-1趟就行,最后一个数据不需要再排序,但要写成i<len也可以
{
for (int j = 0; j+1 < len - i; j++)//j+1 < len - i:防止j+1越界
{
if (arr[j] > arr[j + 1])
{
tmp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = tmp;
}
}
}
}
void Show(int* arr,int len)
{
for (int i = 0; i < len; i++)
{
printf("%d ", arr[i]);
}
}
int main()
{
int arr[] = { 6,4 ,7,8,10,-5,90,34,55};//
Show(arr,sizeof(arr) / sizeof(arr[0]));
printf("\n ");
BubbleSort(arr, sizeof(arr) / sizeof(arr[0]));
Show(arr, sizeof(arr) / sizeof(arr[0]));
}
测试结果:
值得注意的点是:循环终止条件不要写错了。
时间复杂度:O(n^2) //两个for循环
空间复杂度:O(1) // 没有开辟新数组
稳定?稳定 //没有发生跳跃式的交换数据