8.3交换排序
2.编写双向冒泡算法,在正反两个方向交替进行扫描,即第一趟把关键字最大的元素放在序列的最后面,第二趟把关键字最小的元素放在序列的最前面,如此反复进行。

#include <iostream>
#include <algorithm>
using namespace std;typedef int ElemType;ElemType a[50];void BubbleSort(ElemType a[], int n)
{int low = 0, high = n - 1, i;bool flag = true;while (low < high && flag) {flag = false;for (i = low; i < high; i++) {if (a[i] > a[i + 1]) {swap(a[i], a[i + 1]);flag = true;}}high--;for (i = high; i > low; i--) {if (a[i] < a[i - 1]) {swap(a[i], a[i - 1]);flag = true;}}low++;}
}int main()
{int n;cin >> n;for (int i = 0; i < n; i++) cin >> a[i];BubbleSort(a, n);for (int i = 0; i < n; i++) cout << a[i] << " ";cout << endl;return 0;
}

3.已知线性表按顺序存储,且每个元素都是不相同的整形元素,设计把所有奇数移动到所有偶数前边的算法(要求时间最少,辅助空间最少)。

#include <iostream>
#include <algorithm>
using namespace std;typedef int ElemType;ElemType A[50];void move(ElemType A[], int len)
{int i = 0, j = len - 1;while (i < j) {while (i < j && A[i] % 2 != 0) i++;while (i < j && A[j] % 2 != 1) j--;if (i < j) {swap(A[i], A[j]);i++; j--;}}
}int main()
{int n;cin >> n;for (int i = 0; i < n; i++) cin >> A[i];move(A, n);for (int i = 0; i < n; i++) cout << A[i] << " ";cout << endl;return 0;
}

4.试重新编写考点精析中的快速排序的划分算法,使之美词选取的枢轴值都是随机地从当前子表中选择的。

#include <cstdlib>
#include <iostream>
using namespace std;typedef int ElemType;ElemType A[50];int Partition2(ElemType A[], int low, int high)
{int rand_Index = low + rand() % (high - low);swap(A[rand_Index], A[low]);ElemType pivot = A[low];int i = low;for (int j = low + 1; j <= high; j++)if (A[j] < pivot) swap(A[++i], A[j]);swap(A[i], A[low]);return i;
}void QuickSort(ElemType A[], int low, int high)
{if (low < high) {int pivotpos = Partition2(A, low, high);QuickSort(A, low, pivotpos - 1);QuickSort(A, pivotpos + 1, high);}
}int main()
{int n;cin >> n;for (int i = 1; i <= n; i++) cin >> A[i];QuickSort(A, 1, n);for (int i = 1; i <= n; i++) cout << A[i] << " ";cout << endl;return 0;
}

5.试编写一个算法,使之能够在数组L[1…n]中找出第k小的元素(即从小到大排序后处于第k个位置的元素)。

#include <cstdlib>
#include <iostream>
#include <algorithm>
using namespace std;int a[50];int kth_elem(int a[], int low, int high, int k)
{int rand_Index = low + rand() % (high - low + 1);swap(a[rand_Index], a[low]);int pivot = a[low];int low_temp = low; int high_temp = high;while (low < high) {while (low < high && a[high] >= pivot) --high;a[low] = a[high];while (low < high && a[low] <= pivot) ++low;a[high] = a[low];}a[low] = pivot;if (low == k) return a[low];else if (low > k) return kth_elem(a, low_temp, low - 1, k);else return kth_elem(a, low + 1, high_temp, k);
}int main()
{int n, k;cin >> n;for (int i = 1; i <= n; i++) cin >> a[i];cin >> k;int ans =  kth_elem(a, 1, n, k);cout << ans << endl;return 0;
}

6.已知由n(n≥2)n(n \geq 2)n(n≥2)个正整数构成的集合A=ak∣0≤k<nA={a_{k}|0 \leq k < n}A=ak​∣0≤k<n,将其划分为两个不相交的子集A1A_{1}A1​和A2A_{2}A2​,元素个数分别是n1n_{1}n1​和n2n_{2}n2​,A1A_{1}A1​和A2A_{2}A2​中的元素之和分别为S1S_{1}S1​和S2S_{2}S2​。设计一个尽可能高效的划分算法,满足∣n1−n2∣|n_{1}-n_{2}|∣n1​−n2​∣最小且∣S1−S2∣|S_{1}-S_{2}|∣S1​−S2​∣最大。

#include <iostream>
using namespace std;int a[50];int setPartition(int a[], int n)
{int pivotkey, low = 0, low0 = 0, high = n - 1, high0 = n - 1, flag = 1, k = n / 2, i;int s1 = 0, s2 = 0;while (flag) {pivotkey = a[low];while (low < high) {while (low < high && a[high] >= pivotkey) --high;if (low != high) a[low] = a[high];while (low < high && a[low] <= pivotkey) ++low;if (low != high) a[high] = a[low];}a[low] = pivotkey;if (low == k - 1) flag = 0;else {if (low < k - 1) {low0 = ++low;high = high0;} else {high0 = --high;low = low0;}}}for (i = 0; i < k; i++) s1 += a[i];for (i = k; i < n; i++) s2 += a[i];return s2 - s1;
}int main()
{int n;cin >> n;for (int i = 0; i < n; i++) cin >> a[i];int ans = setPartition(a, n);cout << ans << endl;return 0;
}

7.荷兰国旗问题:设有一个仅有红、白、蓝三种颜色的条块组成的条块序列,请编写一个时间复杂度为Q(n)Q(n)Q(n)的算法,使得这些条块按红、白、蓝的顺序排好,即排成荷兰国旗图案。

#include <cstdlib>
#include <iostream>
#include <algorithm>
using namespace std;char a[50];void Flag_Arrange(char a[], int n)
{int i = 0, j = 0, k = n - 1;while (j <= k) {switch (a[j]) {case 'R': swap(a[i], a[j]); i++; j++; break;case 'W': j++; break;case 'B': swap(a[j], a[k]); k--;}}
}int main()
{cin >> a;int n = strlen(a);Flag_Arrange(a, n);for (int i = 0; i < n; i++) cout << a[i];return 0;
}

8.4选择排序
4.编写一个算法,在基于单链表表示的带排序关键字序列上进行简单选择排序。

#include <stdio.h>
#include <stdlib.h>typedef int ElemType;typedef struct LinkNode {ElemType data;struct LinkNode *link;
} LinkNode, *LinkedList;LinkedList init()
{LinkedList head = (LinkedList)malloc(sizeof(LinkNode));int n;ElemType x;scanf("%d", &n);scanf("%d", &x);head->data = x;head->link = NULL;LinkNode *tail = head;for (int i = 1; i < n; i++) {LinkedList temp = (LinkedList)malloc(sizeof(LinkNode));scanf("%d", &x);temp->data = x;tail->link = temp;temp->link = NULL;tail = tail->link;}return head;
}void selectSort(LinkedList &L)
{LinkNode *h = L, *p, *q, *r, *s;L = NULL;while (h != NULL) {p = s = h; q = r = NULL;while (p != NULL) {if (p->data > s->data) {s = p;r = q;}q = p;p = p->link;}if (s == h) h = h->link;else r->link = s->link;s->link = L;L = s;}
}void printList(LinkedList L)
{while (L) {printf("%d ", L->data);L = L->link;}printf("\n");
}int main()
{LinkedList L = init();selectSort(L);printList(L);return 0;
}

5.试设计一个算法,判断一个数据序列是够构成一个小根堆。

#include <iostream>
using namespace std;typedef int ElemType;ElemType A[50];bool IsMinHeap(ElemType A[], int len)
{if (len % 2 == 0) {if (A[len / 2] > A[len]) return false;for (int i = len / 2 - 1; i >= 1; i--)if (A[i] > A[2 * i] || A[i] > A[2 * i + 1]) return false;} else {for (int i = len / 2; i >= 1; i--)if (A[i] > A[2 * i] || A[i] > A[2 * i + 1]) return false;}return true;
}int main()
{int n;cin >> n;for (int i = 1; i <= n; i++) cin >> A[i];if (IsMinHeap(A, n)) cout << "Yes" << endl;else cout << "No" << endl;return 0;
}

8.6各种内部排序算法的比较与应用
4.设有一个数组中存放了一个无序的关键序列K1,K2,…,KnK_{1},K_{2},…,K_{n}K1​,K2​,…,Kn​。现要求将KnK_{n}Kn​放在将元素排序后的正确位置上,试编写实现该功能的算法,要求比较关键字的次数不超过nnn。

#include <iostream>
using namespace std;typedef int ElemType;ElemType K[20];int Partition(ElemType K[], int n)
{int i = 1, j = n;ElemType pivot = K[j];while (i < j) {while (i < j && K[i] <= pivot) i++;if (i < j) K[j] = K[i];while (i < j && K[j] >= pivot) j--;if (i < j) K[i] = K[j];}K[i] = pivot;return i;
}int main()
{int n;cin >> n;for (int i = 1; i <= n; i++) cin >> K[i];int p = Partition(K, n);cout << p << endl;return 0;
}

2022年王道数据结构考研复习指导习题代码(排序)相关推荐

  1. 2022年王道数据结构考研复习指导习题代码(栈和队列)

    3.1栈 1.写出一个算法,判定所给的操作序列是否合法.若合法,返回true,否则返回false(假定被判定的操作序列已存入一维数组中). #include <stdio.h> #incl ...

  2. 2019数据结构考研复习指导习题代码(王道论坛)

    2019数据结构考研复习指导习题代码(王道论坛) 1.从顺序表删除具有最小值的元素(假设唯一)并由函数返回被删除元素的值.空出的位置由最后一个元素补充,若顺序表为空则显示出错信息并退出运行. bool ...

  3. 2023王道数据结构考研习题汇总

    2023王道数据结构考研复习习题汇总目录 文章目录 2023王道数据结构考研复习习题汇总目录 第2章:线性表 2.2线性表的顺序表示-综合应用题(基础题1-9) 2.2线性表的顺序表示-综合应用题(4 ...

  4. 研大考研:2015西医综合考研复习指导

    研大考研:2015西医综合考研复习指导 西医综合复习技巧 1.了解考点:十几年来,考试范围的变化并不大.要认真的归纳总结过去的真题,所有的考点,就会跃然纸上.通过总结我们发现,有许多试题,在不同的年份 ...

  5. 22考研计算机专业课——数据结构【❤️考研复习指导❤️】

    本次复习指导是基于我在21考研初试中我的王道考研数据结构这本书,加上[数据结构与算法设计]这本教材,书上和笔记本上都记满了笔记和重难点,所以在此回顾这些基本知识点,不能做到我当时的面面俱到,但是尽量完 ...

  6. 王道计算机操作系统考研复习指导知识点总结

    一.绪论 操作系统是指控制和管理整个计算机系统的硬件与软件资源.合理地组织.调度计算机的工作与资源的分配,进而为用户和其他软件提供方便接口与环境的程序集合 功能:处理机管理.存储器管理.设备管理.文件 ...

  7. 数据结构考研复习笔记

    数据结构(清华出版的) (就是那本经典的,作者是严老师) 记录考研学习过程,不管写的咋样,就是硬写,就是坚持写. 先说一下我要准备的考试大纲,纲举目张,抓本质. 看着挺吓人的,但是都是纸老虎" ...

  8. 22考研计算机专业课——操作系统【❤️考研复习指导❤️】

    操作系统这门课和其他专业课不同,它很抽象,偏重于概念,我在第一轮复习完后对它很多点都没有理解,比如段页式分配和索引块,直到第二轮和第三轮之后我才彻底理解清楚,做到各种题目也迎刃而解.只要原理弄清楚了, ...

  9. 数据结构考研复习知识点梳理(自用非408)第一章

    第一章.绪论 1.1什么是数据结构 1.数据元素是数据的基本单位,在计算机程序中通常作为一个整体考虑和处理 2.一个数据元素可以由若干个数据项构成,数据项是数据的不可分割的最小单位 3.数据对象是性质 ...

  10. 数据结构考研复习 | Fibonacci数列的递归、数组、迭代(循环)实现及其时间复杂度

    #include <stdio.h> #include <iostream>int fibonacci_recurrence(int n) //递归实现 {if (n == 0 ...

最新文章

  1. Shell的作用与分类
  2. ubuntu18.04.4 安装 dlib (解决 Running setup.py install for dlib ... error错误)
  3. 14.QueuedConnection和BlockingQueuedConnection连接方式源码分析
  4. 命令行工具cobra的使用
  5. [MySQL 5.6] GTID实现、运维变化及存在的bug
  6. 【Unity】6.1 Unity中的C#脚本基础知识
  7. 腾讯再开源三项技术,提升企业开发及运营效率
  8. iOS 编译后的Archiveing 界面在 Windows-organizer 下
  9. 美团服务器不稳定号码保护,美团打车号码保护功能,搭建用户安全的防火墙
  10. java从入门到精通 人民邮电_Java从入门到精通【人民邮电出版社】课后习题答案全集...
  11. 数理统计学:世纪末的回顾与展望(陈希孺)
  12. pq分解法matlab编程,基于MATLAB的PQ分解法电力系统潮流计算.doc
  13. 【计算机组织与体系结构】实验二:给定指令系统的处理器设计
  14. SCARA、通用6轴机器人奇异点位置与问题分析
  15. mysql的root用户没有权限管理_mysql中root用户失去了root权限怎么处理呢?
  16. cognos使用自定义函数_将单点登录添加到您的IBM Cognos 8自定义Java身份验证提供程序
  17. html 滑动拼图验证,vue登录滑动拼图验证
  18. 做转子力学分析,你选APDL还是Workbench仿真?
  19. 【练习】DIY青志协网站(html+css+js未分开)
  20. 结构方程模型的R语言实现

热门文章

  1. pygame游戏素材预处理
  2. WinDbg调试入门
  3. 【H3C模拟器】基于端口VLAN的交换机配置实验(同一vlan互通)
  4. 以新发展理念引领新型智慧城市建设
  5. 512内存安装php7,《滴水石穿-php》虚拟机中安装php7内存错误
  6. fiddler视频分析
  7. linux 中xls格式的文件,如何在命令行中将XLS文件转换为CSV [Linux] | MOS86
  8. KGB知识图谱的功能和特色介绍
  9. 使用libjpeg-turboYUV转JPG
  10. 扬帆跨境电商:虾皮如何匹配最佳图片