(11)排序
来源:互联网 发布:打开软件必备组件 编辑:程序博客网 时间:2024/05/22 11:57
一、排序
本章以介绍插入排序为伊始,进而介绍了快速排序,以及随机选取划分元素的改进的快速排序,且可根据所要排序元素的多少动态的选择是进行插入排序还是快速排序的算法(在元素较少的排序中,插入排序的运行效果可能更好)。插入排序与快速排序这里就不多介绍了。下面看一个这一章的习题。
习题第9题中要求编写一个程序,在O(n)时间内从数组x[0...n-1]中找到第k个最小的元素,算法可以对x当中的元素进行排序。此算法赖子C.A.R. Hoare,是对快速排序算法的一种修改:
#include <stdio.h>#include <stdlib.h>void swap(int x[],int a, int b){int temp = x[a];x[a] = x[b];x[b] = temp;}int randint(int l,int u){return l+rand()%(u-l+1);}void select(int x[],int l,int u,int k){int i,j,temp,t; if (l>=u)return;swap(x,l,randint(l,u));t = x[l];i = l;j = u+1;while (1){do {i++;} while(i<=u && x[i]<t);do {j--;} while(x[j]>t);if (i>j)break;temp = x[i];x[i] = x[j];x[j] = temp;}swap(x,l,j);if (j<k){select(x,j+1,u,k);}else if (j>k){select(x,l,j-1,k);}}void main(){int x[8] = {1, -2, 3, 10, -4, 7, 2, -5};int k;printf("输入要找的第k小元素(0<=k<=7):");scanf("%d",&k);select(x,0, 7, k);printf("%d/n", x[k]);}问题扩展:分治法找第k小元素。找到数组第K小元素后,有且只有x[0]至x[k-1]是比x[k]小的。所以同样算法可解决下面问题,复杂度同为O(n)。
给定一个具有n个元素的整数集,一个整数t以及一个整数k,如何快速确定该整数集是否存在一具有k个元素的子集,其中各元素的总和至多只能为t?
#include <stdio.h>#define MAXN 8int x[MAXN] = {1, -2, 3, 10, -4, 7, 2, -5};void swap(int a, int b){int ntemp = x[a];x[a] = x[b];x[b] = ntemp;}int MinK(int l, int h, int k){if (l > h)return 0;int m = l;for (int i=l+1; i<=h; i++){if (x[i] < x[m])swap(++m, i);}swap(m, l);if (k == m)return x[m];else if (k < m)return MinK(l, m-1, k);elsereturn MinK(m+1, h, k);}int main(int argc, char* argv[]){//第0小元素是最小元素int n = MinK(0, MAXN-1, 6); printf("%d/n", n); return 0;}
注:另外,要求一个数组的第k小或者第k大的数则可通过建立最大最小堆来实现,时间复杂度为O(nlogk)。
0 0
- 算法、排序(11)
- (11)冒泡排序
- (11)排序
- 排序11:计数排序
- 排序(希尔排序)
- 排序(堆排序)
- 排序(希尔排序,堆排序,归并排序,快速排序)
- 排序(插入排序,希尔排序,归并排序,快速排序)
- 11-快排(排序)
- 数据结构(11)之排序
- 数据结构与算法分析11(排序-快速排序及相关分析、排序分析)
- 交换排序(冒泡排序、快速排序)
- 排序之一(插入排序、归并排序)
- 1202 排序(冒泡排序,快速排序)
- 单链表排序(快速排序、归并排序)
- 选择排序、锦标赛排序、堆排序)
- 排序-插入排序(希尔排序)
- 排序-选择排序(直接选择排序)
- oracle10g在windows平台下的安装及监听的配置
- NET调用新浪微博接口示例
- struts2开发时通过interceptor拦截器实现输入数据过滤前后空格的功能
- 【转】嵌入式学习推荐线路
- Integer Inquiry(大数加法)
- (11)排序
- uva-575
- html元素倾斜
- 方法论、方法论——程序员的阿喀琉斯之踵
- 2013级C++第17周项目——字符串、指针应用
- Html5中的本地存储
- PHP问题:js中的encodeURIcomponent 函数在php如何实现?
- 单片机不起振原因分析(转)
- 在心中画一个太阳