巧妙利用快速排序法的原理求一个数组中的第10大元素

//快速排序法
int QuickSort_process3(int *a, int low, int high)
{
	int l, h, temp;
	l = low;
	h = high;
	temp = a[low];
	while (l < h){
		while (l< h&&a[h] >= temp)
			--h;
		if (l < h)
			a[l] = a[h];
		while (l < h&&a[l] < temp)
			++l;
		if (l < h)
			a[h] = a[l];
	}
	a[h] = temp;
	return h;
}

void QuickSort3(int *a, int low,int high)
{
	int pos;
	if (low < high){
		pos = QuickSort_process3(a,low,high);
		QuickSort3(a,low,pos-1);
		QuickSort3(a,pos+1,high);
	}
}

int getTop_N_Numbers(int *a,int n)
{
	int pos, curpos, e;
	do{
		printf("Please input a numbers(less than %d and bigger than 0).\n", n);
		scanf("%d",&e);
	} while (!(e<=n&&e>=1));
	pos = n - e;/*在一个从小到大排序的数组中,最大第e个数的下标恰好是n-e*/
	curpos = QuickSort_process3(a, 0, n - 1);/*一趟快排结束时,肯定会有一个已经确定了位置的数,返回它的下标*/
	while (1){
		if (curpos == pos){/*当要找的第几最大的数的位子已经确定后,说明,比它还要大的数也已经确定了,就不再排序了,直接返回*/
			break;
		}
		else if (curpos < pos){/*在后半部找*/
			curpos = QuickSort_process3(a,curpos+1,n-1);
		}
		else{/*在前半部分找*/
			curpos = QuickSort_process3(a,0,curpos-1);
		}
	}
	return pos;
}

void show_TopN_numbers(int *a,int n)
{
	int k = getTop_N_Numbers(a, n);
	int i;
	printf("The Top %d numbers are :\n",n-k);
	for (i = k; i < n; ++i)
		printf("%d ",a[i]);
	printf("\n");
}

巧妙利用快速排序法的原理求一个数组中的第10大元素

时间: 2024-10-09 22:39:31

巧妙利用快速排序法的原理求一个数组中的第10大元素的相关文章

496. Next Greater Element I 另一个数组中对应的更大元素

[抄题]: You are given two arrays (without duplicates) nums1 and nums2 where nums1's elements are subset of nums2. Find all the next greater numbers for nums1's elements in the corresponding places of nums2. The Next Greater Number of a number x in nums

软件工程结对开发之求一个数组中连续最大子数组之和

一.团队成员: 檀威,陈志利 二.项目名: 求一个数组中连续最大子数组之和 三.我们的设计思路: 设sum[i]为以第i个元素结尾且和最大的连续子数组.对于元素i,所有以它前面的元素结尾的子数组的长度都已经求得,那么以第i个元素结尾且它们之和最大的连续子数组要么是以第i-1个元素结尾且它们之和最大的连续子数组加上这个元素,要么是只包含第i个元素,即sum[i] = max(sum[i-1] + arr[i], arr[i]).可以通过判断sum[i-1] + arr[i]是否大于arr[i]来做

求一个数组中只出现一次的数字

/* 求一个数组中只出现一次的数字(注:只针对数组中有两个数不同,且其他数字两两相同) 题目:一个整型数组里除了两个数字出现一次外,其他的数字都出现了两次:求出现一次的数字: 如:数组a[]={2,4,3,6,3,2,5,5};执行程序后应输出4和6:因为4,6只在该数组中出现了一次 思路:两个数字相同其异或结果一定为0,先异或->再分组-->再对每个子序列异或 算法: 1. 先对数组的每一个元素进行异或操作,求结果(本质就是对那两个不同的数的异或,即4^6=0010) 2.根据异或的操作结果

求一个数组中最大连续子序列的和

10.求一个数组中最大连续子序列的和 参考链接:http://blog.csdn.net/butwang/article/details/4691974 思路:如果已经知道在前0~k-1共k个元素中,在最大和为MaxAll[k-1], 怎么求0~k共k+1个元素的MaxAll[k]. 如果前k个元素的最大和子序列包括a[k-1],则很容易知道MaxAll[k] = max(MaxAll[k-1] + a[k], a[k]).那如果前k个元素的最大和子序列不包括a[k-1]呢?在数组后面增加一个元

从一个数组中随机取出一定数量元素组成新数组

/** * 从一个数组中随机取出一定数量元素组成新数组 * @param array 一个String类型的数组 * @param number需要取出元素的数量 * @return 一个随机的数组 * @throws NullPointerException原数组不能为空 *@throws ArrayIndexOutOfBoundsException新数组长度应不大于原数组的长度 */ public static String[]  getRandomArray(String[] array,

18 如何从一个数组中移除重复的元素

两种方法 (1) 使用LINQ (2) 使用List static void RemoveDups(string[] myStringArray) { // LINQ string[] str = myStringArray.Distinct().ToArray(); // Array to List to Array List<String> myStringList = new List<string>(); foreach (string s in myStringArray

“支配着” 是在数组中出现频率超过一半的整数,求一个数组中的支配者

"支配着" 是在数组中出现频率超过一半的整数,例如{3, 2, 3, 3, 0, 2, 3, 4, 3},其中3出现5次,5除以9大于0.5,所以3是支配者.写一个函数,在给定的整数数组中找出支配者是多少,如果一个数组中没有支配者,则返回1. package cn.usst.DataTest5; import java.util.Arrays; public class DataTest5 { /** * "支配着" 是在数组中出现频率超过一半的整数 * @para

求一个数组中a[0...i-1] 离a[i]最接近的值

博客主页:http://blog.csdn.net/minna_d 题目: 给一个n个元素的线性表A,对于每个数Ai,找到它之前的数中,和它最接近的数.即对于每个i,计算 Ci = min{|Ai-Aj| | 1<=j<i} 规定C1 = 0. 其实就是给定一个数组, 在a[0....i-1]中求离a[i]最近的值, 其实这里有个bug,那就是,如果对与6而言5,7都离它一样, 那么该输出谁呢 N久不写C, 感觉怪怪的, 写了一个java版. 思路: 用一个临时数组存储,离a[i]最近值 用另

[LeetCode169]Majority Element求一个数组中出现次数大于n/2的数

题目: Given an array of size n, find the majority element. The majority element is the element that appears more than ⌊ n/2 ⌋ times. You may assume that the array is non-empty and the majority element always exist in the array. 思路:可以利用Dictionary将数组中每个数