求数组中第k小的数,有快速排序的验证

// The_Least_K_number.cpp : 定义控制台应用程序的入口点。
//数组中第k小的数,例如a[1000]中第250小的数//

#include "stdafx.h"
#include <iostream>
using namespace std;

void swap(int *p, int *q)
{
	int temp = *p;
	*p = *q;
	*q = temp;
}

int patition(int a[], int first, int last)
{
	int key = a[last];
	int i , j;
	i = j = first;
	for (j = first; j < last; j++)
	{
		if (a[j]<=key)
		{
			swap(&a[j],&a[i]);
			i++;
		}
	}
	swap(&a[i],&a[last]);
	return i;
}

void quicksort(int a[], int first, int last)
{
	int k;
	if (first<last)
	{
		k = patition(a,first,last);
		quicksort(a,first,k-1);
		quicksort(a,k+1,last);
	}
}

int find_k_number_index(int a[], int first, int last,int k)
{

	int index;
	int m = patition(a,first,last);

	if (m==k)
		index = m;
	else if (m>k)
		index = find_k_number_index(a,first,m-1,k);
	else
		index = m + find_k_number_index(a,m+1,last,k-m-1)+1;

	return index;

}

int find_k_number(int a[], int first, int last, int k)
{
	int index = find_k_number_index(a,first,last,k);
	return a[index-1];
}

int _tmain(int argc, _TCHAR* argv[])
{
	int a[100];
	for (int i = 0; i < 100; i++)
	{
		a[i] = i;
	}

	cout<<find_k_number(a,0,99,98)<<endl;
	quicksort(a,0,99);
	for (int i = 0; i < 100; i++)
	{
		cout<<a[i]<<"\t";
	}
	return 0;
}

时间: 2024-08-02 02:50:32

求数组中第k小的数,有快速排序的验证的相关文章

选择问题(选择数组中第K小的数)

由排序问题可以引申出选择问题,选择问题就是选择并返回数组中第k小的数,如果把数组全部排好序,在返回第k小的数,也能正确返回,但是这无疑做了很多无用功,由上篇博客中提到的快速排序,稍稍修改下就可以以较小的时间复杂度返回正确结果. 代码如下: #include<iostream> using namespace std; #define Cutoff 3 int A[13] = {81,94,11,96,12,35,17,95,28,58,41,75,15}; void Swap(int &

算法导论:快速找出无序数组中第k小的数

题目描述: 给定一个无序整数数组,返回这个数组中第k小的数. 解析: 最平常的思路是将数组排序,最快的排序是快排,然后返回已排序数组的第k个数,算法时间复杂度为O(nlogn),空间复杂度为O(1).使用快排的思想,但是每次只对patition之后的数组的一半递归,这样可以将时间复杂度将为O(n). 在<算法导论>有详细叙述 这里主要用C++实现,实现思路就是先选取当前数组的第一个数作为"主轴",将后面所有数字分成两部分,前面一部分小于"主轴",后面一部

找到轮转后的有序数组中第K小的数

我们可以通过二分查找法,在log(n)的时间内找到最小数的在数组中的位置,然后通过偏移来快速定位任意第K个数. 此处假设数组中没有相同的数,原排列顺序是递增排列. 在轮转后的有序数组中查找最小数的算法如下: int findIndexOfMin(int num[],int n) { int l = 0; int r = n-1; while(l <= r) { int mid = l + (r - l) / 2; if (num[mid] > num[size]) { l = mid + 1;

找轮转后的有序数组中第K小的数

我们可以通过二分查找法,在log(n)的时间内找到最小数的在数组中的位置,然后通过偏移来快速定位任意第K个数. 此处假设数组中没有相同的数,原排列顺序是递增排列. 在轮转后的有序数组中查找最小数的算法如下: int findIndexOfMin(int num[],int n) { int l = 0; int r = n-1; while(l <= r) { int mid = l + (r - l) / 2; if (num[mid] > num[r]) { l = mid + 1; }

求数组中第k大的数(分治法)

思想:快排 因为单趟排序是使选定的king值到其应该到的位置,所以每次判断这个king的正确位置是否是第K大数的位置即可 #include <iostream> using namespace std; //快排中的单趟排序 int PartSort(int* arr,int start,int end) { int first = start; int last = end; int tmp = arr[first]; int key = first; while (first < l

查找序列中第K小的数与快速排序

#include <algorithm>#include <iostream> int Partition(int X[], int left, int right){ int pivot = X[left]; int L = left; int R = right; while(L < R) { while(X[L] <= pivot && L < right) { ++L; } while(X[R] > pivot &&

挑战面试编程:查找数组中第k大的数

查找数组中第k大的数 问题: 查找出一给定数组中第k大的数.例如[3,2,7,1,8,9,6,5,4],第1大的数是9,第2大的数是8-- 思路: 1. 直接从大到小排序,排好序后,第k大的数就是arr[k-1]. 2. 只需找到第k大的数,不必把所有的数排好序.我们借助快速排序中partition过程,一般情况下,在把所有数都排好序前,就可以找到第k大的数.我们依据的逻辑是,经过一次partition后,数组被pivot分成左右两部分:S左.S右.当S左的元素个数|S左|等于k-1时,pivo

POJ 2761-Feed the dogs(划分树)求区间内第k小的数

Feed the dogs Time Limit: 6000MS   Memory Limit: 65536K Total Submissions: 17679   Accepted: 5561 Description Wind loves pretty dogs very much, and she has n pet dogs. So Jiajia has to feed the dogs every day for Wind. Jiajia loves Wind, but not the

[经典算法题]寻找数组中第K大的数的方法总结

[经典算法题]寻找数组中第K大的数的方法总结 责任编辑:admin 日期:2012-11-26 字体:[大 中 小] 打印复制链接我要评论 今天看算法分析是,看到一个这样的问题,就是在一堆数据中查找到第k个大的值. 名称是:设计一组N个数,确定其中第k个最大值,这是一个选择问题,当然,解决这个问题的方法很多,本人在网上搜索了一番,查找到以下的方式,决定很好,推荐给大家. 所谓"第(前)k大数问题"指的是在长度为n(n>=k)的乱序数组中S找出从大到小顺序的第(前)k个数的问题.