利用快速排序原理找出数组中前n大的数
#include <stdio.h>
#include <stdint.h>
#include <stdlib.h>
#define MAX_SIZE 400001
// 生成不重复的随机数序列写入文件
void gen_test_data(uint32_t cnt)
{
if( cnt >= MAX_SIZE){printf("cnt too largr\n");return;}
uint32_t i = ;
char buf[MAX_SIZE];
for(;i < cnt;++i){buf[i] = ;}
uint32_t n = ;
char file_name[];
snprintf(file_name,,"test_data_%d.txt",cnt);
FILE *fp = fopen(file_name,"w");
if(NULL == fp){printf("open %s error!\n",file_name);return;}
while(n < cnt)
{
int32_t nRand = rand() % cnt;
while(buf[nRand] == )nRand = (nRand + )%cnt;
buf[nRand] = ;
fprintf(fp,"%d ",nRand);
++n;
}
fclose(fp);
} // 读取文件
void read_data(int32_t arr[],const uint32_t size,uint32_t *cnt,const int32_t data_cnt)
{
FILE *fp = NULL;
char file_name[];
if(data_cnt > size){printf("data_cnt too largr\n");return;}
snprintf(file_name,,"test_data_%d.txt",data_cnt);
fp = fopen(file_name,"r");
if(NULL == fp){printf("open %s error!\n",file_name);return;}
while(!feof(fp) && *cnt < size)
{
fscanf(fp,"%d ",&arr[*cnt]);
(*cnt)++;
}
fclose(fp);
} // 快速排序
void quick_sort(int32_t arr[],int32_t low,int32_t high)
{
if(low >= high)return;
int32_t i = low,j = high,tmp = arr[i];
while(i<j)
{
while(i<j && arr[j] <= tmp)j--;
if(i<j){arr[i] = arr[j];i++;}
while(i<j && arr[i] > tmp)i++;
if(i<j){arr[j] = arr[i];j--;}
}
arr[i] = tmp;
quick_sort(arr,low,i-);
quick_sort(arr,i+,high);
} // 找出最大n个数
void get_topn(int32_t arr[],int32_t low,int32_t high,const int32_t topn)
{
if(low >= high || topn > high)return;
int32_t i = low,j = high,tmp = arr[i];
while(i<j)
{
while(i<j && arr[j] < tmp)j--;
if(i<j)arr[i++] = arr[j];
while(i<j && arr[i] >= tmp)i++;
if(i<j)arr[j--] = arr[i];
}
arr[i] = tmp;
int32_t n = i - low + ;
if (n == topn)return;
else if (n > topn)
get_topn(arr, low, i-, topn);
else if (n < topn)
get_topn(arr, i+, high, topn - n);
} void dump(int32_t arr[],const uint32_t cnt)
{
uint32_t i = ;
for(;i < cnt;++i)
{
printf("%6d ",arr[i]);
}
printf("\n");
} int32_t main(int32_t argc,char *argv[])
{
int32_t data_cnt = ,top = ;
int32_t arr[MAX_SIZE];
uint32_t cnt = ;
gen_test_data(data_cnt);
read_data(arr,MAX_SIZE,&cnt,data_cnt);
get_topn(arr,,cnt-,top);
quick_sort(arr,,top-);
dump(arr,top);
//quick_sort(arr,0,cnt);
//dump(arr,cnt);
return ;
}
利用快速排序原理找出数组中前n大的数的更多相关文章
- python找出数组中第二大的数
		
#!usr/bin/env python #encoding:utf-8 ''''' __Author__:沂水寒城 功能:找出数组中第2大的数字 ''' def find_Second_large_ ...
 - 找出数组前N大的数
		
这个题也是个比较有名的面试题.当然有很多变种. 题目意思基本是:从一个数据量很大的数组里找前N大的元素.不允许排序. 这个题有两个比较好的思路: 思路一:用快速排序的思想,是思想,不是要排序; 思路二 ...
 - 利用堆排序找出数组中前n大的元素
		
#include <stdio.h> #include <stdint.h> #include <stdlib.h> #include <time.h> ...
 - [LeetCode] Find All Numbers Disappeared in an Array 找出数组中所有消失的数字
		
Given an array of integers where 1 ≤ a[i] ≤ n (n = size of array), some elements appear twice and ot ...
 - 剑指offer.找出数组中重复的数字
		
题目: 给定一个长度为 n 的整数数组 nums,数组中所有的数字都在 0∼n−1 的范围内.数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次.请找出数组中任意一个重复的数 ...
 - 【Offer】[3-1] 【找出数组中重复的数字】
		
题目描述 思路 Java代码 代码链接 题目描述 在一个长度为n的数组里的所有数字都在0~n-1的范围内.数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次. 请找出数组中任 ...
 - 前端算法题:找出数组中第k大的数字出现多少次
		
题目:给定一个一维数组,如[1,2,4,4,3,5],找出数组中第k大的数字出现多少次. 例如:第2大的数是4,出现2次,最后输出 4,2 function getNum(arr, k){ // 数组 ...
 - 一起来刷《剑指Offer》-- 题目一:找出数组中重复的数字(Python多种方法实现)
		
数组中重复的数字 最近在复习算法和数据结构(基于Python实现),然后看了Python的各种"序列"--比如列表List.元组Tuple和字符串String,后期会写一篇博客介绍 ...
 - 剑指Offer:找出数组中出现次数超过一半的元素
		
题目:找出数组中出现次数超过一半的元素 解法:每次删除数组中两个不同的元素,删除后,要查找的那个元素的个数仍然超过删除后的元素总数的一半 #include <stdio.h> int ha ...
 
随机推荐
- 微信公众账号开发之微信登陆Oauth授权-第一篇
			
我曾经在2012年的时候开始研究微信,那时微信的版本还是处于1.0,当时给朋友帮忙做一个基于微信端的web应用,官方的文档是相当少的,百度搜索出来的东西基本也没有多少实用价值,不过是在官网的基础上作了 ...
 - 贪心 HDOJ 4726 Kia's Calculation
			
题目传送门 /* 这题交给队友做,做了一个多小时,全排列,RE数组越界,赛后发现读题读错了,囧! 贪心:先确定最高位的数字,然后用贪心的方法,越高位数字越大 注意:1. Both A and B wi ...
 - CodeForces Round 194 Div2
			
A. Candy Bagstime limit per test1 secondmemory limit per test256 megabytesinputstandard inputoutputs ...
 - Toll-Free Bridge
			
引 在深入了解桥接机制的时候看到一篇好文,虽然已经很久远,但是忍不住看了好几遍,心中诸多不解一扫而光.在此放上链接: 原文:http://ridiculousfish.com/blog/posts/b ...
 - [转载]git 忽略某些文件
			
项目中经常会生成一些Git系统不需要追踪(track)的文件.典型的是在编译生成过程中 产生的文件或是编程器生成的临时备份文件.当然,你不追踪(track)这些文件,可以 平时不用"git ...
 - How to override create,write,unlink method in Odoo v8
			
As we all know, Odoo 8 has new api which is different with v7. So how to override the create,write,u ...
 - 结合自己的程序对thinkphp模板常量的理解
			
先上个图,有时候路径很多,没理解会搞混,看手册的说明 页面login.html模板的访问路径为http://www.tp.com/index.php/admin/Manager/login,测试他的常 ...
 - linux进程用户内存空间和内核空间
			
When a process running in user mode requests additional memory, pages are allocated from the list of ...
 - Java垃圾收集机制
			
通常,我们把分配出去后,却无法回收的内存空间称为"内存渗漏体(Memory Leaks)". 以上这种程序设计的潜在危险 性在Java这样以严谨.安全著称的语言中是不允许的.但是J ...
 - 理解 Python 中的 *args 和 **kwargs
			
Python是支持可变参数的,最简单的方法莫过于使用默认参数,例如: def test_defargs(one, two = 2): print 'Required argument: ', one ...