![](https://img-blog.csdnimg.cn/20201014180756923.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
排序
一根小羽毛
这个作者很懒,什么都没留下…
展开
-
内部排序算法
直接插入排序void insert_sort(int a[], int n){ int i; for(i = 2; i <= n; i++) { a[0] = a[i]; for(j = i-1; a[0] < a[j]; j--) { a[j+1] = a[j]; } a[j+1] = a[0]; }}时间复杂度:O(n)~O(n2)空间复杂度:原创 2021-07-29 11:27:03 · 98 阅读 · 0 评论 -
堆的课后题
1、堆和二叉排序树的区别以大顶堆为例,大顶堆的特点是要求左右孩子的关键字值小于双亲关键字值,对于左右孩子关键字值的大小没有次序规定。而二叉排序树要求左孩子关键字值小于双亲关键字值,右孩子关键字值大于双亲关键字值,每个双亲结点与左右孩子之间的关键字值有次序关系。当对两种树执行中序遍历时,二叉排序树会得到一个递增序列,堆不一定能得到有序序列。2、若只想得到一个序列中第k(k>=5)个最小元素之前的部分排序序列,最好采用什么排序方法?插入排序、快速排序都需要将所有元素排序之后才能得到前k个最小。原创 2021-07-27 11:06:46 · 531 阅读 · 0 评论 -
荷兰国旗问题
有一个仅有红、白、蓝三种颜色的条块组成的条块序列,编写一个时间复杂度为O(n)的算法,使得这些条块按红白蓝的顺序排好。顺序扫描线性表,设三个指针typedef enum{red, white, blue} color;void f(color a[], int n){ int i = 0, j = 0, k = n-1; while(j < k) { switch(a[j]) { case red: Swap(a[原创 2021-07-26 16:40:40 · 114 阅读 · 0 评论 -
|n1-n2|最小且|S1-S2|最大
将由n个正整数构成的集合A划分成两个不相交的子集A1和A2,元素个数是n1和n2,A1和A2中的元素之和分别是S1和S2,设计一个尽可能高效的划分算法,满足|n1-n2|最小且|S1-S2|最大思路:自己想的是从两边冒泡排序,直到中间相遇,答案给的思想是快排的,而且不用全部排序,每一次排一半,时间复杂度是O(n),更优。答案:1)基本设计思想:将最小的n/2个元素放入A1,其余放入A2,即可满足题干要求。按照快速排序的思想,每次找到枢轴所在位置,将集合一分为二。设枢轴所在最终位置为i,若 i== n原创 2021-07-26 16:24:38 · 874 阅读 · 0 评论 -
找到第k小的元素
找到在数组中第k小的元素int f(ElemType a[], int low, int high, int k){ int i = low, j = high; ElemType t = a[i]; while(i < j) { while(a[j] >= t && i < j) j--; a[i] = a[j]; while(a[i] <= t && i <原创 2021-07-26 15:43:18 · 41 阅读 · 0 评论 -
随机选取枢轴值
void f(int low, int high){ int k = low + rand() % (high - low + 1); //这里别忘了要加low,每次不一定是从0开始的,rand()随机函数趋取余区间长度 Swap(a[k], a[low]); ElemType t = a[low]; int i = low, j = high; while(i < j) { while(a[j] >= t) j--;原创 2021-07-26 15:34:37 · 161 阅读 · 0 评论 -
奇数放前偶数放后
线性表按顺序存储,设计把所有奇数放到所有偶数的前面,要求时间最少,辅助空间最少void f(int a[]){ int i = 0, j = n-1; while(i < j) { while(a[i]%2!=0 && i < j) i++; while(a[i]%2==0 && i < j) j--; if(i < j) { int t原创 2021-07-26 15:17:08 · 94 阅读 · 0 评论 -
双向冒泡啊
void s(int n){ int i = 0, j = n-1, t, i1, j1, flag = 1; while(i < j && flag) { flag = 0; for(i1 = i ; i1 < j; i1++) { if(a[i] > a[i+1]) { t = a[i];原创 2021-07-26 15:09:08 · 53 阅读 · 0 评论