赞
踩
目录
1、思路
2、解答
- // 1.直接插入排序
- void insertSort(int a[], int n) {
- int i, j;
- // 将第2~n个元素依次插入已排好序的队列中
- for ( i = 1 ; i < n ; i++ ) {
- int temp;
- // 只有a[i]<a[i-1](已排序好的最后一个元素)时才需要移动
- if ( a[i] < a[i - 1] ) {
- // temp暂存待排序的a[i]
- temp = a[i];
- // 所有大于temp的元素都后移一位
- for ( j = i - 1 ; a[j] > temp ; --j ) {
- a[j + 1] = a[j];
- }
- // 将待排序元素插入最终位置
- a [j + 1] = temp;
- }
- }
- }
- //2.折半插入排序
- void insertSort2(int a[], int n) {
- int i, j, low, high, mid,temp;
- // 将第2~n个元素依次插入已排好序的队列中
- for ( i = 2; i <= n ; i++ ) {
- temp = a[i];
- // 折半查找的两个端点值
- low = 1, high = i-1;
- // while循环条件:low<=high
- while ( low <= high ) {
- mid = (low + high) / 2;
- if ( temp < a[mid] )
- high = mid-1; // 查找左半子表
- else
- low = mid+1; // 查找右半子表
- }
- for ( j = i - 1 ; j >= high + 1 ; --j ) {
- a[j + 1] = a[j];
- }
- // 将待排序元素插入最终位置
- a [high + 1] = temp;
- }
- }
- //3.希尔排序
- void shellSort(int a[], int n) {
- int i, j, dk;
- for ( dk = n / 2 ; dk >= 1 ; dk = dk / 2 ) { // 步长变化
- for ( i = dk + 1 ; i <= n ; i++ ) {
- // 将a[i]插入有序增量序列
- if ( a[i] < a[i - dk] ) {
- a[0] = a[i];
- // 注意循环条件
- for ( j = i - dk ; j > 0 && a[j] > a[0] ; j -= dk ) {
- a[j + dk] = a[j];
- }
- a[j + dk] = a[0];
- }
- }
- }
- }
- //4.冒泡排序
- void bubbleSort(int a[],int n){
- int i,j;
- bool flag;
- for ( i = 0 ; i < n ; i++ ) {
- // 标志本趟冒泡是否发生交换
- flag = false;
- for ( j = n-1 ; j > i ; j-- ) {
- int temp;
- if ( a[j] < a[j-1] ) {
- temp = a[j];
- a[j] = a[j-1];
- a[j-1] = temp;
- flag = true;
- }
- }
- // 本次冒泡没有发生交换,说明已有序
- if (!flag)
- return;
- }
- }
一个大坑:写的时候把pivot写成了a[pivot],结果怎么都不对,自己来回对了几遍也没发现问题……
- //5.快速排序
- int Partition(int a[], int low, int high) {
- // 选取第一个元素作为枢轴元素
- int pivot = a[low];
- while (low < high) {
- // high所指向的元素大于等于枢轴元素,--high
- while (low < high && a[high] >= pivot ) --high;
- // 比枢轴元素小的移到左边
- a[low] = a[high];
- // low所指向的元素小于等于枢轴元素,++low
- while (low < high && a[low] <= pivot ) ++low;
- // 比枢轴元素大的移到右边
- a[high] = a[low];
- }
- // 跳出循环时low=high,枢轴元素存在到a[high]
- a[low] = pivot;
- return low;
- }
-
- void quickSort(int a[], int low, int high) {
- if ( low < high ) {
- int pivotpos = Partition(a, low, high);
- quickSort(a, low, pivotpos - 1);
- quickSort(a, pivotpos + 1, high);
- }
- }
1、思路
2、源代码
- #include <iostream>
- #include <cstdio>
- #include <algorithm>
- using namespace std;
-
- // 定义学生结构体
- struct Student {
- int id;
- int score;
- };
-
- // 自定义比较函数
- bool comp (Student a, Student b) {
- // 成绩相等比较学号
- if (a.score == b.score)
- return a.id < b.id;
- else
- // 成绩不等比较成绩
- return a.score < b.score;
- }
-
- int main() {
- int n;
- scanf("%d\n", &n);
- Student arr[n];
- for (int i = 0 ; i < n ; i++) {
- scanf("%d %d\n", &arr[i].id, &arr[i].score);
- }
- sort(arr, arr + n, comp);
- for (int i = 0 ; i < n ; i++) {
- printf("%d %d\n", arr[i].id, arr[i].score);
- }
- return 0;
- }
1、思路
2、总结
3、源代码
- // version 1 : stable_sort()实现
- #include <iostream>
- #include <cstdio>
- #include <algorithm>
- using namespace std;
-
- // 定义学生结构体
- struct Student {
- string name;
- int score;
- };
-
- // 升序或降序
- int flag;
-
- // 自定义排序函数
- bool cmp(Student a, Student b) {
- if (flag == 0) {
- return a.score > b.score;
- } else
- return a.score < b.score;
- }
-
-
- int main() {
- int n;
- while ( cin >> n ) {
- cin >> flag;
- Student s[n];
- for ( int i = 0 ; i < n ; i++) {
- cin >> s[i].name >> s[i].score;
- }
- stable_sort(s, s + n, cmp);
- for ( int i = 0 ; i < n ; i++) {
- cout << s[i].name << " " << s[i].score << endl;
- }
- }
- }
- // version 2 : 给Student结构体添加id属性实现稳定排序
- #include <iostream>
- #include <cstdio>
- #include <algorithm>
- using namespace std;
-
- // 定义学生结构体
- struct Student {
- string name;
- int score;
- int id; // 标识录入的先后顺序
- };
-
- // 升序或降序
- int flag;
-
- // 自定义排序函数
- bool cmp(Student a, Student b) {
- if (flag == 0) {
- // 分数相等,id小的在前
- if (a.score == b.score) {
- return a.id < b.id;
- } else {
- // 分数不等,按分数降序排列
- return a.score > b.score;
- }
- } else {
- if (a.score == b.score) {
- return a.id < b.id;
- } else {
- // 分数不等,按分数升序排列
- return a.score < b.score;
- }
- }
- }
-
-
- int main() {
- int n;
- while ( cin >> n ) {
- cin >> flag;
- Student s[n];
- for ( int i = 0 ; i < n ; i++) {
- cin >> s[i].name >> s[i].score;
- s[i].id=i; // 给id赋值
- }
- stable_sort(s, s + n, cmp);
- for ( int i = 0 ; i < n ; i++) {
- cout << s[i].name << " " << s[i].score << endl;
- }
- }
- }
1、思路
2、源代码
- #include <iostream>
- #include <algorithm>
- using namespace std;
-
- #define N 1010
-
- int a[N];
-
- int main() {
- int n;
- int i;
- cin >> n;
- for (i = 0 ; i < n ; i++) {
- cin >> a[i];
- }
- // 对数组a升序排列
- sort(a,a+n);
- // 输出最后一个元素(即最大值)
- cout << a[n-1] << endl;
- // 判断是否有剩下的数
- if( n==1 ) {
- cout << "-1" << endl;
- } else {
- for (i = 0 ; i < n-1 ; i++) {
- cout << a[i] << " "; // 依次输入前n-1个有序元素
- }
- cout << endl;
- }
-
- }
整数奇偶排序_牛客题霸_牛客网 (nowcoder.com)
1、思路
- #include <iostream>
- #include <algorithm>
- using namespace std;
-
- bool cmp(int a,int b) {
- return a > b;
- }
-
- int main() {
- int a[10];
- int even[10],odd[10];
- int i,j=0,k=0;
- for (i = 0 ; i < 10 ; i++) {
- cin >> a[i];
- if (a[i]%2 == 0) {
- even[j++] = a[i]; // a[i]是偶数,存入even
- } else {
- odd[k++] = a[i]; // a[i]是奇数,存入odd
- }
- }
- sort(odd,odd+k,cmp); // 对奇数降序排列
- for(i = 0 ; i < k ; i++) {
- cout << odd[i] << " ";
- }
- sort(even,even+j); // 对偶数升序排列
- for(i = 0 ; i < j ; i++) {
- cout << even[i] << " ";
- }
- cout << endl;
- }
2、其他方法
① 先把所有的按从小到大排序,然后遍历两次数组。第一遍从后往前,遇到奇数就输出;第二遍从前往后,遇到偶数就输出。(很巧妙,通过从后往前遍历实现奇数的降序排列)
- #include <iostream>
- #include <algorithm>
- using namespace std;
-
- int main() {
- int a[10];
- while(cin>>a[0]>>a[1]>>a[2]>>a[3]>>a[4]>>a[5]>>a[6]>>a[7]>>a[8]>>a[9]) {
- // 对数组a升序排序
- sort(a,a+10);
- // 从后往前遍历排序好的a数组,遇到奇数就输出
- for(int i = 9 ; i >= 0 ; --i) {
- if (a[i]%2 == 1)
- cout << a[i]<< " ";
- }
- // 从前往后遍历排序好的a数组,遇到偶数就输出
- for(int i = 0 ; i < 10 ; ++i) {
- if (a[i]%2 == 0)
- cout << a[i]<< " ";
- }
- cout << endl;
- }
- }
② 在cmp函数中书写比较逻辑:传入两个整型参数a,b
- #include <iostream>
- #include <algorithm>
- using namespace std;
-
- bool cmp (int a,int b) {
- if ( a%2==1 && b%2==1 ) // a、b都是奇数,降序排列
- return a > b;
- else if ( a%2==0 && b%2==0 ) // a、b都是偶数,升序排列
- return a < b ;
- else
- return a%2 > b%2; // 这里没看懂orz
- }
-
- int main() {
- int a[10];
- for (int i = 0 ; i < 10 ; i++) {
- cin >> a[i];
- }
- sort(a,a+10,cmp);
- for (int i = 0 ; i < 10 ; i++) {
- cout << a[i] << " ";
- }
- cout << endl;
- }
1、思路
2、源代码
- #include <iostream>
- #include <algorithm>
- using namespace std;
-
- struct Mouse { // 定义老鼠结构体
- int weight;
- string color;
- };
-
- bool cmp(Mouse a, Mouse b) { // 定义cmp比较函数,按重量降序排列
- return a.weight > b.weight;
- }
-
- int main() {
- int n;
- cin >> n;
- Mouse m[n];
- for (int i = 0 ; i < n ; i++) {
- cin >> m[i].weight >> m[i].color;
- }
- sort(m, m + n, cmp);
- for (int i = 0 ; i < n ; i++ ) {
- cout << m[i].color << endl;
- }
- }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。