冒泡排序的基本思想
两两相邻记录的关键字,如果反序则交换,直到没有反序的记录为止。
先看看一般常见的冒泡排序代码:
#include<iostream>
using namespace std;
void bubble(int k[],int n)
{
int temp;
for (int i = 0; i < n - 1; i++) //当前比较元素的下标
{
for (int j = i + 1; j < n; j++) //当前比较元素的下一个元素下标
{
if (k[i] > k[j])
{
temp = k[i];
k[i] = k[j];
k[j] = temp;
}
}
}
}
int main()
{
int k[10] = { 5,2,3,0,1,6,8,9,11,7 };
bubble(k, 10);
cout << "排序后的结果是:" << endl;
for (int i = 0; i < 10; i++)
{
cout << k[i] << " ";
}
cout << endl;
system("pause");
return 0;
}
但是上面这样写本质上是不属于冒泡排序,因为冒泡排序是比较两个相邻的元素,但是上面这样写就是:(比如)第一个元素和剩下的所有元素比较之后进行交换。
冒泡排序的要点:
(1)两两注意是相邻两个的意思
(2)如果n个元素需要比较n-1次,每一轮减少1次比较
(3)既然叫做冒泡排序,那就是从下往上两两进行比较,所以看上去就像是泡泡往上冒一样。
正确的冒泡排序算法:
#include<iostream>
using namespace std;
void bubble(int k[],int n)
{
int temp;
for (int i = 0; i < n - 1; i++) //表示循环进行的每一轮
{
for (int j = n-1; j >i; j--) //每一轮比较的次数都会比上一轮减少一次
{
if (k[i] > k[j])
{
temp = k[i];
k[i] = k[j];
k[j] = temp;
}
}
}
}
int main()
{
int k[10] = { 5,2,3,0,1,6,8,9,11,7 };
bubble(k, 10);
cout << "排序后的结果是:" << endl;
for (int i = 0; i < 10; i++)
{
cout << k[i] << " ";
}
cout << endl;
system("pause");
return 0;
}
改进一下:
#include<iostream>
using namespace std;
void bubble(int k[],int n)
{
int temp;
int flag = 1;
int count1 = 0;
int count2 = 0;
for (int i = 0; i < n - 1&&flag; i++) //表示循环进行的每一轮
{
for (int j = n-1; j >i; j--) //每一轮比较的次数都会比上一轮减少一次
{
count1++;
flag = 0;
if (k[i] > k[j])
{
count2++;
temp = k[i];
k[i] = k[j];
k[j] = temp;
flag = 1;
}
}
}
cout << "总共进行了" << count1 << "次比较,进行了" << count2 << "次移动。" << endl;
}
int main()
{
int k[10] = { 5,2,3,0,1,6,8,9,11,7 };
bubble(k, 10);
cout << "排序后的结果是:" << endl;
for (int i = 0; i < 10; i++)
{
cout << k[i] << " ";
}
cout << endl;
system("pause");
return 0;
}
加上了flag之后,就会减少几次比较,如果没有满足条件的话,就不用进行比较了。