版权声明:沉迷代码,难以自拔 https://blog.csdn.net/qq_33846054/article/details/79514127
编程笔记 cha 2-1 排序
排序算法
1. 排序(牛客网)
#include <iostream>
#include <algorithm>
using namespace std;
/*
题目:排序
思路:1--n冒泡排序、选择排序、快排
*/
void bubbleSort(int a[],int n){
int t;
for (int i=0;i<n-1;i++){
for (int j=0;j<n-i-1;j++){
if (a[j]>a[j+1]){
t = a[j];
a[j] = a[j+1];
a[j+1] = t;
}
}
}
}
void selectSort(int a[],int n){
int k,t;
for (int i=0;i<n-1;i++){
k = i;
for (int j=i+1;j<n;j++){
if (a[j]<a[k]){
k = j;
}
}
if (k!=i){
t = a[k];
a[k] = a[i];
a[i] = t;
}
}
}
void Qsort(int a[],int low,int high){
if (low >= high)
return;
int first = low ;
int last = high ;
int key = a[first];
while (first < last){
while (first < last && a[last] >= key){
--last; // last先减一,再与first比较
}
a[first] = a[last];
while (first < last && a[first] <= key){
++first;
}
a[last] = a[first];
}
a[first]=key; // 交换过程中key并没有交换,此时first/last之前的比key小,之后的比key大,递归调用
Qsort(a,low,first-1);
Qsort(a,first+1,high);
}
bool cmp(int x,int y){
return x>y;
}
void print(int a[],int n){
for (int i=0;i<n;i++)
cout << a[i] << ' ';
cout<<endl;
}
int main()
{
int n,a[101];
while (cin >> n){
for (int i=0;i<n;i++)
cin >> a[i];
//bubbleSort(a,n);
//selectSort(a,n);
//sort(a,a+n);//内置快排升序算法,推荐使用
//sort(a,a+n,cmp);重载降序
Qsort(a,0,n-1);
print(a,n);
}
return 0;
}
2.成绩排序
#include <iostream>
#include <algorithm>
#include <string.h>
using namespace std;
/*
题目:成绩排序
思路:内置排序函数+重构cmp
*/
struct Stu{
char name[100];
// string name;
int age;
int grade;
};
bool cmp(Stu s1,Stu s2){
if (s1.grade != s2.grade)
return s1.grade < s2.grade;//成绩低的在前面
int tmp = strcmp(s1.name,s2.name);
// int tmp = s1.name - s2.name;
if (tmp != 0)
return tmp < 0; // 字典序小的在前面
return s1.age < s2.age;
}
void print(Stu s[],int n){
for (int i=0;i<n;i++)
cout << s[i].name << ' '<<s[i].age<<' '<<s[i].grade<<endl;
}
int main()
{
int n;
Stu s[1001];
while (cin >> n){
for (int i=0;i<n;i++)
cin >> s[i].name>>s[i].age>>s[i].grade;
sort(s,s+n,cmp);
print(s,n);
}
return 0;
}
特殊排序
#include <iostream>
#include <algorithm>
#include <string.h>
using namespace std;
/*
题目:特殊排序
思路:内置排序函数+重构cmp
*/
void print(int a[],int n){
cout<<a[n-1]<<endl;
if (n!=1){
for (int i=0;i<n-2;i++)
cout << a[i] << ' ';
cout <<a[n-2]<<endl;
// 提示格式错误:最后一个数后面没有空格
}
else{
cout<<-1<<endl;
}
}
int main()
{
int n,a[1001];
while (cin >> n){
for (int i=0;i<n;i++)
cin >> a[i];
sort(a,a+n);
print(a,n);
}
return 0;
}
EXCEL排序
#include <iostream>
#include <algorithm>
#include <string.h>
using namespace std;
/*
题目:EXCEL排序
遇到的问题:定义number和name同时为char类型时,在一行内输入“010000 ack 30 ”时空格
会被视为字符串内的一个字符,因此连续cin多个字符串时应当用回车来分离字符串。
这里审题不清:将number定义为整数够用。
报错:编译错误:
error: control may reach end of non-void function [-Werror,-Wreturn-type]
原因:某些测试条件下函数没有响应的返回
输出int number时为了变成‘000001’的6位形式需加上my_itoa()函数
当number和name都是char[]类型时的另一种输入方法:
scanf("%s %s %d",buf[i].num,buf[i].name,&buf[i].score);
*/
struct Stu{
int number;
char name[8];
int grade;
}student[100000];
int c;
/*
替代写法:
cout << setw(6) << setfill('0') << list[i].num << " ";
setw设置输出宽度为6位
除去输出数据num所占位数外其余填充fill0
*/
char *my_itoa(int n)
{
static char str[7];
int i;
for(i=0;i<6;i++)
str[i]='0';
str[7]='\0';
i=5;
while(n)
{
str[i--]=n%10 + '0';
n/=10;
}
return str;
}
bool cmp(Stu a,Stu b)
{
switch(c)
{
case 1:return a.number<b.number;
case 2:
if (strcmp(a.name,b.name)==0)
return a.number-b.number<0;
else
return strcmp(a.name,b.name)<=0;
case 3:
if (a.grade==b.grade)
return a.number<b.number;
else
return a.grade<=b.grade;
default:return 0;
}
}
/*
cmp函数的另一种写法:
bool cmp1(stu a, stu b) {
return a.num < b.num; // 递增,当a<b时返回真
}
bool cmp2(stu a, stu b) {
return a.name <= b.name;// 非递减
}
bool cmp3(stu a, stu b) {
if (a.grade != b.grade) {
return a.grade <= b.grade; // 非递减
}
else {
return a.num < b.num;
}
}
*/
void print(int n)
{
cout<<"Case:"<<endl;
for (int i=0;i<n;i++)
{
cout<<my_itoa(student[i].number)<<" "<<student[i].name<<" "<<student[i].grade<<endl;
}
}
int main()
{
int n;
while (cin>>n)
{
cin>>c;
for (int i=0;i<n;i++)
{
cin>>student[i].number;
cin>>student[i].name;
cin>>student[i].grade;
}
sort(student,student+n,cmp);
print(n);
}
return 0;
}
字符串排序
#include <iostream>
#include <algorithm>
#include <string.h>
#include <stdio.h>
using namespace std;
/*
题目:字符串内排序
思路:字符串相当于一个数组,字母本质是个整数,所以用sort()配合strlen()求出字符串长度绰绰有余啦。
*/
int main()
{
char str[200];
while (scanf("%s",str)!=EOF)
{
sort(str,str+strlen(str));
cout<<str<<endl;
}
return 0;
}