(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
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 孩子初中了书写越来越潦草怎么办 给孩子自由孩子无法无天怎么办 孩子挑食幼儿园老师该怎么办 老师说孩子挑食家长怎么办 工作中老是粗心不细心怎么办 小孩数学总是特别粗心该怎么办 孩子起范疙瘩的怎么办 做题马虎不认真怎么办 孩子考差了家长怎么办 小孩写作业不认真怎么办 小孩不认真检查作业怎么办 一年级的小孩作业不认真怎么办 一年级学生做题粗心怎么办 一年级的学生做题粗心怎么办 孩子做作业注意力不集中怎么办 小学三年孩子抄答案怎么办 孩子写作业不认真审题怎么办 一年级小孩审题不认真怎么办 孩子审题不认真马虎怎么办 孩子做作业不认真审题怎么办? 考老师考砸了怎么办 重要考试考砸了怎么办 二年级孩子做数学题粗心怎么办 二年级孩子考试粗心怎么办 二年级孩子考试总是粗心怎么办 二年级孩子总是粗心怎么办 小学一年级孩子抄别人作业怎么办 被老师发现抄答案怎么办 考试抄答案被老师发现怎么办 孩子撒谎不写作业怎么办 小学生做题容易马虎出错怎么办 小学生做题老是马虎怎么办 小学生做题马虎不认真怎么办 会做的题总做错怎么办 孩子数学做题粗心怎么办 孩子成绩考差了怎么办 孩子静不下心学习怎么办 孩子考试时总是粗心马虎怎么办 小学二年级学生厌学怎么办 三岁宝宝肚脐痛怎么办 做题速度太慢怎么办