这三种排序虽然用处不多,并且效率不高,但是它们都是稳定的排序算法,并且容易混淆,这里给出实现代码帮助读者区分
首先是插入排序
1 #include<iostream> 2 using namespace std; 3 const int maxn=1000005; 4 int n; 5 int a[maxn]; 6 void insert_sort(int* a) 7 { 8 for(int i=2;i<=n;i++) 9 { 10 int tmp=a[i]; 11 int j=i-1; 12 while(j>=0&&tmp<a[j]) 13 { 14 a[j+1]=a[j]; 15 j--; 16 } 17 a[j+1]=tmp; 18 } 19 } 20 int main() 21 { 22 std::ios::sync_with_stdio(false); 23 cin>>n; 24 for(int i=1;i<=n;i++) 25 cin>>a[i]; 26 insert_sort(a); 27 for(int i=1;i<=n;i++) 28 cout<<a[i]<<" "; 29 cout<<endl; 30 return 0; 31 }
插入排序的实现思路真的就是把当前元素插入到对应自己大小的位置上,然后比它大的这些元素都往后挪动一位,但是写的时候要注意对下标的控制,否则容易出错
然后是选择排序
1 #include<iostream> 2 using namespace std; 3 const int maxn=1000005; 4 const int INF=0x7f7f7f7f; 5 int n; 6 int a[maxn]; 7 void select_sort(int* a) 8 { 9 for(int i=1;i<=n;i++) 10 { 11 int tmp=i; 12 for(int j=i+1;j<=n;j++) 13 { 14 if(a[j]<a[tmp]) 15 tmp=j; 16 } 17 int t=a[i]; 18 a[i]=a[tmp]; 19 a[tmp]=t; 20 } 21 } 22 int main() 23 { 24 std::ios::sync_with_stdio(false); 25 cin>>n; 26 for(int i=1;i<=n;i++) 27 cin>>a[i]; 28 select_sort(a); 29 for(int i=1;i<=n;i++) 30 cout<<a[i]<<" "; 31 cout<<endl; 32 return 0; 33 }
选择排序有两种实现方法,第一种是不断去求最小值,每求一个最小值就放在一个数组里,然后在原数组里把它打上标记,计算下一个最小值的时候不再去访问它
第二种方法是所有排序算法中最好写的(不要提sort函数),我们枚举每一个位置,然后对于每一个位置,枚举这个位置之后的所有元素,把最小的那个换过来
本文提供的便是第二种方法的代码
最好是冒泡排序
1 #include<iostream> 2 using namespace std; 3 const int maxn=1000005; 4 const int INF=0x7f7f7f7f; 5 int n; 6 int a[maxn]; 7 void bubble_sort(int* a) 8 { 9 for(int i=1;i<=n;i++) 10 for(int j=1;j<=n-i;j++) 11 { 12 if(a[j]>a[j+1]) 13 { 14 int t=a[j]; 15 a[j]=a[j+1]; 16 a[j+1]=t; 17 } 18 } 19 } 20 int main() 21 { 22 std::ios::sync_with_stdio(false); 23 cin>>n; 24 for(int i=1;i<=n;i++) 25 cin>>a[i]; 26 bubble_sort(a); 27 for(int i=1;i<=n;i++) 28 cout<<a[i]<<" "; 29 cout<<endl; 30 return 0; 31 }
记冒泡排序只需要记住一点,每次都是对两个相邻的元素进行比较和交换,每次都把大的元素一直换到后面,一共换n次就排好序了
这里可以加入一个优化,我们进行每一轮交换的时候交换元素的个数可以每次减少1,为啥呢?因为每进行一次排序,就有一个元素已经排好序并且被放在了后面,之后的数都比它小,就不用再次比较了
这三种排序算法的时间复杂度都是O(n^2)的,但是针对不同的数据可能会表现出不同的效率,他们都是稳定的排序算法