在跟着b站大雪菜(https://www.acwing.com/solution/acwing/)学习后,整理如下,用于复习。
一 排序算法的稳定性与复杂度
二 排序算法的思想及实现
1.冒泡排序
1.1思想
- 比较相邻的元素。如果第一个比第二个大,就交换他们两个。
- 对每一对相邻元素做同样的工作,从开始第一对到结尾的最后一对。在这一点,最后的元素应该会是最大的数。
- 针对所有的元素重复以上的步骤,除了最后一个。
- 持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。
1.2实现
void bubble_sort(vector<int> &q){
for (int i = q.size()-1; i > 0; i--){
bool flag = false;
for(int j = 0; j+1 <= i; j++){
if(q[j] > q[j+1]){
swap(q[j],q[j+1]);
flag = true;
}
if(!flag) break;
}
}
}
2.插入排序
2.1思想(整理扑克牌)
- 从第一个元素开始,该元素可以已经认为被排序
- 取出下一个元素,在已经排序的元素序列中从后向前扫描
- 如果该元素(已排序)大于新元素,将该元素移到下一位置
- 重复步骤3,知道找到已排序的元素小于或者等于新元素的位置
- 将新元素放到该位置
- 重复步骤2-5
2.2实现
void insert_sort(vector<int> &q){
for(int i = 1; i < q.size(); i++){
int t =q [i],j;//记下来以防覆盖
for(j = i-1; j >= 0; j--){
if(q[j] > t){
q[j+1] = q[j];
else break;
}
q[j+1] = t;
}
}
}
3.选择排序
3.1思想
就是选出数列中最大或者最小(根据题目要求,本例则是选出最小的元素)的元素放在数列的靠前位置(称为有序区)。然后再从剩余的元素(称为无序区)中选出最大或者最小的元素,放在已排序的部分后面。以此类推,直到结束。
3.2实现
伪代码
SelectSort (input ele[],input length)
for i <- 1 to length step 1
min <- i
for j <- i+1 to length step 1
if ele[j] < ele[min]
min <- j
end if
swap(ele[j],ele[min])
end
实现
void select_sort(vector<int> &q){
for (int i = 0;i<q.size();i++){
for(int j=i+1;j<q.size();j++){
if(q[i]>q[j]){
swap(q[i],q[j]);
}
}
}
}
三 总结
确定下标位置时需要仔细考虑.
未完