稳定排序:冒泡、插入、归并
不稳定排序:快排、选择、写入、堆
1、冒泡排序
-
相邻元素两两比较,如果左边比右边大,就交换;否则不变,继续比较下一个相邻元素。每趟可以确定一个元素,经过n-1趟即可完成排序
-
稳定性:因为两个元素相等时 不会交换,所以相对位置不变,是稳定排序
-
时间复杂度 o(n^2) ,空间 o 1, 原地算法,稳定
-
代码:
//i是比较的趟数,j是元素的下标
void bubbleSort(vector<int>& a, int n) {
for (auto i = 0; i < n-1; ++i) { //n-1趟
for (int j = 0; j < n - i - 1; ++j) { //这一趟中参与比较的元素(上次确定的不用比了)
if (a[j] > a[j + 1])
swap(a[j], a[j + 1]);
}
}
}
- 优化(如果在这一趟中没有元素发生交换,说明已经排好序了,此时就可以结束冒泡了)
void bubbleSort2(vector<int>& nums) {
int len = nums.size();
bool flag = false;
for (int i = 0; i < len-1; ++i) //n-1趟
{
flag = false;//每一趟开始时,都是标记为false,表示没发生交换
for (int j = 0; j < len - 1 - i; ++j) //遍历元素,j指向左边的元素
{
if (nums[j] > nums[j + 1])
{
flag = true;//如果交换了,就标记为true
swap(nums[j], nums[j + 1]); //交换
}
}
if (!flag)//说明没有交换,则表明[0,len-i-1]已经是有序的了
break;
}
}