排序算法
1.插入排序
2.桶排序
1.插入排序
基本思想:将初始数据分为有序部分和无序部分;每一步将无序部分的第一个值插入到前面已经排好序的有序部分中,直到插完所有元素为止。
步骤如下:
- 每次从无序部分中取出第一个值,然后,与有序部分中的值从后向前依次比较;
- 有序部分比较:当前大于后就交换值;
- 重复①②步骤;直到不再交换,就结束循环!
- 最后输出循环结果。
假如有[5,2,3,9,4,7] 6个元素值,有序部分为[2,3,5,9],无序部分为[4,7];接下来要把无序部分的“4”元素插入到有序部分,来展示一下插入排序的运行过程。
- 其中,浅绿色代表有序部分,黄色代表无序部分。
- 在无序部分中挑出要插入到有序部分中的元素。
- 将插入的元素与左边最近的有序部分的元素进行比较。由于4 < 9,所以9向后移,4向前移。
- 继续与左边最近的有序部分的元素进行比较。由于4 < 5,所以5向后移,4继续向前移。
- 继续将4与3比较。由于4 > 3,所以不再向前比较,插入到当前位置。此时有序部分,由[2,3,5,9] 变成 [2,3,4,5,9]。
//3.插入排序
#include<iostream>
using namespace std;
int a[1000],n;
int main(){
cin>>n;
for(int i=0;i<n;i++){ //1.输入值到数组
cin>>a[i];
}
for(int i=1;i<n;i++){
for(int j=i-1;j>=0;j--){
if(a[j+1]<a[j]){ // 后一个数小于前一个数
swap(a[j+1],a[j]); // 交换
}
else{ //因都是有序的,都满足后数>前数,那循环结束了。
break;
}
}
}
for(int i=0;i<n;i++){
cout<<a[i]<<" ";
}
}
-
稳定性:在使用插入排序时,元素从无序部分移动到有序部分时,必须是不相等(大于或小于)时才会移动,相等时不处理,所以直接插入排序是稳定的。
-
时间复杂度:选择排序的时间复杂度为O()。
-
适用场景:待排序序列的元素个数不多(<=50),且元素基本有序。
2.桶排序
基本思想:将待排序的数值k,装入第k个桶,桶号就是待排序的数值,顺序输出各桶的值,得到有序的序列。
例如有 [5,4,9,4],把数值依次装入桶a; 那可以看出 a[4] = 2,a[5] = 1,a[9] = 1;
那输出时候,按照顺序输出有桶号 4 4 5 9;
步骤:
- 先创建b桶数组并初始化值为0。
- 把k值装入第k个桶 b[k]++,对输入的同一个桶号,就累加。
- k是输入的桶号,也可以用a[i]表示,b[a[i]]++ 。
- 当有桶号数量 b[i]!=0 ,代表第i个桶是有值的,就输出桶号;
- 输出后就少了一个值要减掉,即 b[i]--。
编程对1万以内的数进行排序:
#include<iostream>
using namespace std;
int a[100000],b[100000],n;
int main(){
cin>>n;
for(int i=1; i<=n; i++){
cin >> a[i]; //输入桶号
b[a[i]]++; // 统计桶号数量1
}
for(int i=1; i<=10000; i++){
while(b[i]!=0){ //当有桶号
cout<<i<<" "; //输出桶号值
b[i]--; //桶号数量减1
}
}
return 0;
}
- 时间复杂度:选择排序的时间复杂度为O(n)。
- 适用场景:桶排序适用于数据量一般的排序场景。