### 编程笔记 cha 2-1 排序
排序算法
1. 排序(牛客网)
1 #include <iostream> 2 #include <algorithm> 3 using namespace std; 4 /* 5 题目:排序 6 思路:1--n冒泡排序、选择排序、快排 7 */ 8 void bubbleSort(int a[],int n){ 9 int t; 10 for (int i=0;i<n-1;i++){ 11 for (int j=0;j<n-i-1;j++){ 12 if (a[j]>a[j+1]){ 13 t = a[j]; 14 a[j] = a[j+1]; 15 a[j+1] = t; 16 } 17 } 18 } 19 } 20 void selectSort(int a[],int n){ 21 int k,t; 22 for (int i=0;i<n-1;i++){ 23 k = i; 24 for (int j=i+1;j<n;j++){ 25 if (a[j]<a[k]){ 26 k = j; 27 } 28 } 29 if (k!=i){ 30 t = a[k]; 31 a[k] = a[i]; 32 a[i] = t; 33 } 34 } 35 } 36 void Qsort(int a[],int low,int high){ 37 if (low >= high) 38 return; 39 40 int first = low ; 41 int last = high ; 42 int key = a[first]; 43 while (first < last){ 44 while (first < last && a[last] >= key){ 45 --last; // last先减一,再与first比较 46 } 47 a[first] = a[last]; 48 while (first < last && a[first] <= key){ 49 ++first; 50 } 51 a[last] = a[first]; 52 } 53 a[first]=key; // 交换过程中key并没有交换,此时first/last之前的比key小,之后的比key大,递归调用 54 Qsort(a,low,first-1); 55 Qsort(a,first+1,high); 56 57 } 58 bool cmp(int x,int y){ 59 return x>y; 60 } 61 void print(int a[],int n){ 62 for (int i=0;i<n;i++) 63 cout << a[i] << ' '; 64 cout<<endl; 65 } 66 int main() 67 { 68 int n,a[101]; 69 while (cin >> n){ 70 for (int i=0;i<n;i++) 71 cin >> a[i]; 72 //bubbleSort(a,n); 73 //selectSort(a,n); 74 //sort(a,a+n);//内置快排升序算法,推荐使用 75 //sort(a,a+n,cmp);重载降序 76 Qsort(a,0,n-1); 77 print(a,n); 78 79 } 80 return 0; 81 }
2.成绩排序
1 #include <iostream> 2 #include <algorithm> 3 #include <string.h> 4 using namespace std; 5 /* 6 题目:成绩排序 7 思路:内置排序函数+重构cmp 8 */ 9 struct Stu{ 10 char name[100]; 11 // string name; 12 int age; 13 int grade; 14 }; 15 bool cmp(Stu s1,Stu s2){ 16 if (s1.grade != s2.grade) 17 return s1.grade < s2.grade;//成绩低的在前面 18 int tmp = strcmp(s1.name,s2.name); 19 // int tmp = s1.name - s2.name; 20 if (tmp != 0) 21 return tmp < 0; // 字典序小的在前面 22 return s1.age < s2.age; 23 } 24 void print(Stu s[],int n){ 25 for (int i=0;i<n;i++) 26 cout << s[i].name << ' '<<s[i].age<<' '<<s[i].grade<<endl; 27 28 } 29 int main() 30 { 31 int n; 32 Stu s[1001]; 33 while (cin >> n){ 34 for (int i=0;i<n;i++) 35 cin >> s[i].name>>s[i].age>>s[i].grade; 36 sort(s,s+n,cmp); 37 print(s,n); 38 } 39 40 41 return 0; 42 }
特殊排序
1 #include <iostream> 2 #include <algorithm> 3 #include <string.h> 4 using namespace std; 5 /* 6 题目:特殊排序 7 思路:内置排序函数+重构cmp 8 */ 9 10 void print(int a[],int n){ 11 cout<<a[n-1]<<endl; 12 if (n!=1){ 13 for (int i=0;i<n-2;i++) 14 cout << a[i] << ' '; 15 cout <<a[n-2]<<endl; 16 // 提示格式错误:最后一个数后面没有空格 17 } 18 else{ 19 cout<<-1<<endl; 20 } 21 } 22 int main() 23 { 24 int n,a[1001]; 25 while (cin >> n){ 26 for (int i=0;i<n;i++) 27 cin >> a[i]; 28 sort(a,a+n); 29 print(a,n); 30 } 31 32 33 return 0; 34 }
EXCEL排序
1 #include <iostream> 2 #include <algorithm> 3 #include <string.h> 4 using namespace std; 5 /* 6 题目:EXCEL排序 7 遇到的问题:定义number和name同时为char类型时,在一行内输入“010000 ack 30 ”时空格 8 会被视为字符串内的一个字符,因此连续cin多个字符串时应当用回车来分离字符串。 9 这里审题不清:将number定义为整数够用。 10 11 报错:编译错误: 12 error: control may reach end of non-void function [-Werror,-Wreturn-type] 13 原因:某些测试条件下函数没有响应的返回 14 15 输出int number时为了变成‘000001’的6位形式需加上my_itoa()函数 16 17 当number和name都是char[]类型时的另一种输入方法: 18 scanf("%s %s %d",buf[i].num,buf[i].name,&buf[i].score); 19 */ 20 struct Stu{ 21 int number; 22 char name[8]; 23 int grade; 24 }student[100000]; 25 int c; 26 /* 27 替代写法: 28 cout << setw(6) << setfill('0') << list[i].num << " "; 29 setw设置输出宽度为6位 30 除去输出数据num所占位数外其余填充fill0 31 */ 32 char *my_itoa(int n) 33 { 34 static char str[7]; 35 int i; 36 for(i=0;i<6;i++) 37 str[i]='0'; 38 str[7]='