交换排序-冒泡排序
- 基本思想:通过无序区中相邻记录关键字间的比较和位置交换,使关键字最小的记录如气泡一般逐渐往上漂浮直至水面,所以叫冒泡法。
代码
-
从后往前冒,从小到大排序
void BubbleSort(vector<int>& nums)
{
int n = nums.size()-1;
for(int i = 0;i<=n;i++)
{
for(int j = n; j>i;j--)
{
if(nums[j]<nums[j-1])
{
int temp = nums[j];
nums[j-1] = nums[j];
nums[j] = temp;
}
}
}
}
-
上面代码稍加改动,变成从前往后冒,从小到大排序。
void BubbleSort(vector<int>& nums)
{
int n = nums.size()-1;
for(int i = n;i>0;i--)
{
for(int j = 0;j<i;j++)
{
if(nums[j+1]<nums[j])
{
int temp = nums[j+1];
nums[j+1] = nums[j];
nums[j] = temp;
}
}
}
}、
-
有些情况,在第i趟已经排好序了,不必再进行比较了,可以设置一个标志位,改进代码如下:
void BubbleSort(vector<int>& nums)
{
int n = nums.size()-1;
for(int i = 0;i<=n;i++)
{
for(int j = n; j>i;j--)
{
int exchange = 0;
if(nums[j]<nums[j-1])
{
int temp = nums[j];
nums[j-1] = nums[j];
nums[j] = temp;
exchange = 1;
}
if(exchange == 0) return;
}
}
}
总结
- 不管形式如何变化,基本思想是不变的,两两比较,大的(小的)往后移(或向前移)
- 最坏情况,每次都需要交换元素,时间复杂度O(n^2).
- 最好时间复杂度,只比较,不交换,时间复杂度O(n).
- 平均时间复杂度O(n^2).