冒泡排序:从第一个数到最后一个数,相邻的两个数进行比较,大数下沉,小数上浮,这样获得一个最大值;第二轮中从第一个数到倒数第二个数,两两比较…一共需要比较 n - 1轮。
void bubbleSort(int array[], int n)
{
for (int i = 1; i < n; i++)
for (int j = 0; j < n - i; j++)
{
if (array[j] > array[j + 1])
{
int tmp = array[j];
array[j] = array[j + 1];
array[j + 1] = tmp;
}
}
}
简单改进:对于最好的情况,即数组本来就是有序的,再按照上述代码进行遍历,会浪费很多时间。故在此加入一个标志,如果本轮遍历未发生数据交换,就证明数组已然有序,直接结束循环。
void bubbleSort2(int array[], int n)
{
int flag;
for (int i = 1; i < n; i++)
{
flag = 0;
for (int j = 0; j < n - i; j++)
{
if (array[j] > array[j + 1])
{
flag = 1;
int tmp = array[j];
array[j] = array[j + 1];
array[j + 1] = tmp;
}
}
if (flag == 0)
break;
}
}
假设数组有n个元素
最差时间复杂度O(n2) :倒序 1+2+3+…+n-1
平均时间复杂度O(n2)
最优时间复杂度O(n) : 正序 1+1+1…
空间复杂度O(n)