插入排序题目整理归并(hdu)
将hdu上三道可以用插入排序解决的题目整理了一下,其中hdu2019是最简单的单次插入,而插入排序便是单次插入的循环。而hdu1872则是带上结构的插入循环,依次进阶。
在此我将三题的插入部分写的极为相像方便辨认。
//单次插入 #include <iostream> using namespace std; int main() { int m,n,x[101]; while(cin >> n >> m){ //输入 if(n == 0 && m == 0) break; for(int i = 0;i < n;i++) cin >> x[i]; //插入排序(简易) x[n] = m; int j = n - 1;int key = x[n]; while(j >= 0 && x[j] > key){ x[j+1] = x[j]; x[j--] = key; } //输出 int i; for(i = 0;i < n;i++) cout << x[i] << " "; cout << x[n] << endl; } return 0; }
#include <iostream> using namespace std; int main() { int num,n;int x[1000],j; cin >> num; while(num--){ cin >> n; for(int i = 0;i < n;i++) cin >> x[i]; for(int i = 1;i < n;i++){ j = i - 1; int key = x[i]; while(j >= 0 && x[j] > key){ x[j+1] = x[j]; x[j--] = key; } } j = 0; while(j < n - 1) cout << x[j++] << " "; cout << x[j] << endl; } return 0; }
//结构型插入排序 #include <iostream> using namespace std; struct data { string name; int marks; }; int main() { data a[300];data b[300]; int num; while(cin >> num){ for(int i = 0;i < num;i++) cin >> a[i].name >> a[i].marks; //输入原排列 for(int i = 0;i < num;i++) cin >> b[i].name >> b[i].marks; //输入排序之后的排列 //插入排序 for(int i = 1;i < num;i++){ int j = i - 1; int key1 = a[i].marks; string key2 = a[i].name; while(j >= 0 && a[j].marks < key1){ a[j+1].marks = a[j].marks; a[j+1].name = a[j].name; a[j].name = key2; a[j--].marks = key1; } } //判断并输出 int flag1 = 0,flag2 = 0; for(int i = 0;i < num;i++) { if(a[i].marks == b[i].marks) flag1++; if(a[i].name == b[i].name) flag2++; } if(flag1 == num && flag2 == num) cout << "Right\n"; else if (flag1 == num) { cout << "Not Stable\n"; for(int i = 0;i < num;i++) cout << a[i].name << " " << a[i].marks << endl; } else { cout << "Error\n"; for(int i = 0;i < num;i++) cout << a[i].name << " " << a[i].marks << endl; } cin.clear(); } return 0; }
浙公网安备 33010602011771号