插入排序:
#include<iostream> #include<string.h> using namespace std; void output(int a[], int n){ for(int i = 0; i < n; i++) { cout<<a[i]<<" "; } cout<<endl; } int main(){ int a[105]; memset(a,0,sizeof(a)); int n; cin>>n; for(int i = 0; i < n; i++) { cin>>a[i]; } for(int i = 0; i < n; i++) { int temp = a[i]; int j = i - 1; while(j >= 0 && a[j] > temp){ a[j+1] = a[j]; j--; } a[j+1] = temp; output(a, n); } return 0; }
插入排序,幻想成是你在抓扑克牌的时候。以i为分割线,i之前的扑克牌都是已经拍好顺序的了。
所以你需要在i进行插入的时候,和它前面的一个个比较,若前面的要大于它,就覆盖,直到找到一个小于它的数j,就放在这个数的后面。
插入排序可以高速整理顺序很整齐的数据。
冒泡排序
#include<iostream> #include<string.h> using namespace std; void output(int a[], int n){ for(int i = 0; i < n; i++) { cout<<a[i]<<" "; } cout<<endl; } int main(){ int a[105]; memset(a,0,sizeof(a)); int n; int times=0; cin>>n; for(int i = 0; i < n; i++) { cin>>a[i]; } for(int i = 0; i < n; i++) { for(int j = n-1; j >= i + 1; j--) { if(a[j-1] > a[j]) { int temp = a[j]; a[j] = a[j-1]; a[j-1] = temp; times++; } } } output(a, n); cout<<times; return 0; }
从高处开始,往底层两个两个的判断。就好像泡泡一样把小的往前面送了。一趟完成后,之前未排序部分的第一个肯定是剩下数里最小的。
选择排序
#include<iostream> #include<string.h> using namespace std; void output(int a[], int n){ for(int i = 0; i < n; i++) { cout<<a[i]<<" "; } cout<<endl; } int main(){ int a[105]; memset(a,0,sizeof(a)); int n; int times=0; cin>>n; for(int i = 0; i < n; i++) { cin>>a[i]; } for(int i = 0; i < n; i++) { int index = i; for(int j = i + 1; j < n; j++) { if(a[index] > a[j]){ index = j; } } if(index != i){ int temp = a[index]; a[index] = a[i]; a[i] = temp; times++; } } output(a, n); cout<<times; return 0; }
就是一趟趟地走,每次选择那个最小/大的。
选择排序不一定是一种稳定的算法。如果最小的那个数字和重复大数字交换排序后,就会出现位置变换了。
希尔排序
#include<iostream> #include<string.h> #include<vector> using namespace std; void output(int a[], int n){ for(int i = 0; i < n; i++) { cout<<a[i]<<endl; } } void insertion(int a[], int n, int g, int ×) { for(int i = 0; i < n; i++) { int temp = a[i]; int j = i-g; while(j >= 0 && a[j] > temp) { a[j+g] = a[j]; j = j - g; times++; } a[j+g] = temp; } } int main(){ int a[105]; memset(a,0,sizeof(a)); int n; int times=0; cin>>n; for(int i = 0; i < n; i++) { cin>>a[i]; } vector<int> gs; for(int h=1;;){ if(h>n) break; gs.push_back(h); h = 3*h + 1; } for(int i = gs.size()-1; i >= 0; i--) { insertion(a, n, gs[i], times); } cout<<gs.size()<<endl; for(int i = gs.size()-1; i >= 0; i--) { cout<< gs[i]<<" "; } cout<<endl; cout<<times<<endl; output(a, n); return 0; }
希尔排序是加工过后的插入排序。
是按间隔来分别进行插入排序。这个间隔的算法是按照那个复杂度来的吧,这个题的要求是O(N1.25),所以题目用了gn+1=3gn+1;