代码语言
.
CSharp
.
JS
Java
Asp.Net
C
MSSQL
PHP
Css
PLSQL
Python
Shell
EBS
ASP
Perl
ObjC
VB.Net
VBS
MYSQL
GO
Delphi
AS
DB2
Domino
Rails
ActionScript
Scala
代码分类
文件
系统
字符串
数据库
网络相关
图形/GUI
多媒体
算法
游戏
Jquery
Extjs
Android
HTML5
菜单
网页交互
WinForm
控件
企业应用
安全与加密
脚本/批处理
开放平台
其它
【
C
】
寻找第K小元素
作者:
Congc
/ 发布于
2014/8/4
/
391
寻找第K小元素,类似快排的方法
#include<stdio.h> #include<stdlib.h> #include<string.h> void exchange(int *a,int *b); int FindSmallest(int *Array,int n); int SplitArrayByFirst(int *a,int n); int FindLeastK(int *a,int n,int k); int main(void) { int a[10]={0,3,1,2,4,-1,-8,-77,1000,11}; int result = -2; result = FindLeastK(a,10,1); printf("result:%d\n",result); result = FindLeastK(a,10,2); printf("result:%d\n",result); result = FindLeastK(a,10,3); printf("result:%d\n",result); result = FindLeastK(a,10,4); printf("result:%d\n",result); result = FindLeastK(a,10,5); printf("result:%d\n",result); result = FindLeastK(a,10,6); printf("result:%d\n",result); result = FindLeastK(a,10,7); printf("result:%d\n",result); result = FindLeastK(a,10,8); printf("result:%d\n",result); result = FindLeastK(a,10,9); printf("result:%d\n",result); result = FindLeastK(a,10,10); printf("result:%d\n",result); printf("---------\n"); int b[3]={3,3,3}; result = FindLeastK(b,3,1); printf("result:%d\n",result); result = FindLeastK(b,3,2); printf("result:%d\n",result); result = FindLeastK(b,3,3); printf("result:%d\n",result); return 0; } /********************************* 函 数 名: FindLeastK 函数功能: 返回第K小元素 传入参数: int *a :数组首地址 int n :数组尾标 int k :要求的第K小元素 返 回 值: 第K小元素 *********************************/ int FindLeastK(int *a,int n,int k) { int result = -1; int SplitResult = 0; int *CopyArraya = NULL; /*复制数组,不要破坏原数组*/ CopyArraya = (int *)malloc(sizeof(int)*n); if (CopyArraya == NULL) { printf("malloc ERROR!\n"); return -1; } memcpy(CopyArraya,a,sizeof(int)*n); if (k<0) { printf("k must > 0!"); return -1; } if (k==1)/*k为1时表示查找最小元素即可*/ { result = FindSmallest(CopyArraya,n); free(CopyArraya); return result; } SplitResult = SplitArrayByFirst(CopyArraya,n); if (SplitResult <0) { printf("ERROR\n"); free(CopyArraya); return -1; } if (SplitResult+1 > k) { result = FindLeastK(CopyArraya,SplitResult,k); free(CopyArraya); return result; } else if (SplitResult+1 == k) { result = CopyArraya[SplitResult]; free(CopyArraya); return result; } else { result = FindLeastK(CopyArraya+SplitResult+1,n-SplitResult-1,k-SplitResult-1); free(CopyArraya); return result; } return 0; } /********************************* 函 数 名: exchange 函数功能: 交换2个元素 传入参数: int a;int b 返 回 值: 无 *********************************/ void exchange(int *a,int *b) { *a = (*a) ^ (*b); *b = (*b) ^ (*a); *a = (*a) ^ (*b); return; } /********************************* 函 数 名: FindSmallest 函数功能: 查找数组中最小元素 传入参数: int *Array,int n;数组名和数组元素个数 返 回 值: 数组最小元素 *********************************/ int FindSmallest(int *Array,int n) { int i=0; int Smallest =Array[0]; for (i=1;i<n;i++) { if (Array[i] < Smallest) Smallest = Array[i]; } return Smallest; } /********************************* 函 数 名: SplitArrayByFirst 函数功能: 将传入的数组进行按数组首元素进行划分,使小于等于数组首元素的值放在前面,大于数组首元素的值放在后面 传入参数: int *a :数组首地址 int n :n个元素 返 回 值: 划分元素a[0]的新位置 *********************************/ int SplitArrayByFirst(int *a,int n) { int i=0; int x=a[0]; int j=1; if (n == 1) { return 0; } if (n < 1) { return -1; } for (j=1;j<n;j++) { if (a[j] <= x) { i++; if ( i!= j) { exchange(a+i,a+j); } } } exchange(a,a+i); return i; }
试试其它关键字
第K
小元素
同语言下
.
获取手机通讯录 iOS去除数字以外的所有字符
.
异步加载音乐等资源
.
交通罚单管理系统
.
freemark实现,简单的替换
.
计算斐波那契数列
.
base64解码 包括解码长度
.
图像显示
.
冒泡排序
.
输入十进制数,输出指定进制
.
链式栈
可能有用的
.
C#实现的html内容截取
.
List 切割成几份 工具类
.
SQL查询 多列合并成一行用逗号隔开
.
一行一行读取txt的内容
.
C#动态修改文件夹名称(FSO实现,不移动文件)
.
c# 移动文件或文件夹
.
c#图片添加水印
.
Java PDF转换成图片并输出给前台展示
.
网站后台修改图片尺寸代码
.
处理大图片在缩略图时的展示
Congc
贡献的其它代码
(
2
)
.
找第K小元素
.
寻找第K小元素
Copyright © 2004 - 2024 dezai.cn. All Rights Reserved
站长博客
粤ICP备13059550号-3