加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

寻找前K大数(复习各种排序)

发布时间:2020-12-14 03:43:17 所属栏目:大数据 来源:网络整理
导读:前言 都被别人做烂的题,我一遍都还没做过,略感可耻。。所以,以后没事看看别人做的题,自己也动动手,动动脑。 题目 在长度为N(N=K)的乱序数组S中找出从大到小顺序的第K大的数。 Input:N K Output:S中前K大数 常见解法 将数组从大到小排序,然后取出前K

前言

都被别人做烂的题,我一遍都还没做过,略感可耻。。所以,以后没事看看别人做的题,自己也动动手,动动脑。

题目

在长度为N(N>=K)的乱序数组S中找出从大到小顺序的第K大的数。

Input:N && K

Output:S中前K大数

常见解法

  1. 将数组从大到小排序,然后取出前K大数
  • 简单排序:
void bubble_sort(int *S,int n)  // 冒泡排序
{
	int i,j;
	status flag = TRUE;
	
	for (i = 0; i < n && flag; i++)
	{
		flag = FALSE;
		for (j = n-2; j >= i; j--)
		{
			if (S[j] > S[j+1])
			{
				swap(&S[j],&S[j+1]);
				flag = TRUE;
			}
		}
	}
}

void select_sort(int *S,int n)  // 简单选择
{
	int i,j,min;
	
	for (i = 0; i < n; i++)
	{
		min = i; 
		for (j = i+1; j < n; j++)
		{
			if (S[min] > S[j])
				min = j;
		}
		
		if (i != min)
			swap(&S[i],&S[min]);
	}
}

void insert_sort(int *S,int n)  // 直接插入
{
	int i,temp;
	
	for (i = 1; i < n; i++)
	{
		if (S[i-1] > S[i])
		{
			temp = S[i];
			for (j = i-1; S[j]>temp && j >= 0; j--)
				S[j+1] = S[j];
			S[j+1] = temp;
		}
	}
}
  • 堆排序
void heap_build(int *S,int m,int n)
{
	int j,temp;
	
	temp = S[m];
	for (j = 2*m+1; j <= n; j = 2*m+1)
	{
		if (j < n && S[j] > S[j+1])
			j++;
		if (temp <= S[j])
			break;
		S[m] = S[j];
		m = j;
	}
	
	S[m] = temp;
}

void heap_sort(int *S,int n)
{
	int i;
	
	for (i = (n-1)/2; i >= 0; i--)
		heap_build(S,i,n-1);
	
	for (i = n-1; i > 0; i--)
	{
		swap(&S[0],&S[i]);
		heap_build(S,i-1);
	}
}
  • 快速排序
int quick_partition(int *S,int low,int high)
{
	int temp;
	
	temp = S[low];
	while (low < high)
	{
		while (low < high && S[high] >= temp)
			high--;
		S[low] = S[high];
		
		while (low < high && S[low] <= temp)
			low++;
		S[high] = S[low];
	}
	
	S[low] = temp;
	
	return low;
}

void Qsort(int *S,int high)
{
	int pivot;
	
	while (low < high)
	{
		pivot = quick_partition(S,low,high);
		
		Qsort(S,pivot-1);
		low = pivot+1;
	}
}

void quick_sort(int *S,int n)
{
	Qsort(S,1,n-1);
}
框架代码:
#include <stdio.h>

#define  status  int

#define  TRUE    1
#define  FALSE  0

#define  MAX     100000

int S[MAX];

void swap(int *a,int *b)
{
	int temp = *a;
	
	*a = *b;
	*b = temp;
}

int find_k_num(int *S,int n,int k)
{
	int i;
  
	// XXX_sort(S,n);  各种排序...

	printf("The new sort:n");
	for (i = 0; i < n; i++)
	{
		printf("%d ",S[i]);
	}

    return S[k-1];
}

void main()
{
    int i,n,k;
    int k_num;

    while (1)
    {
        printf("Input n && k:n");
        scanf("%d %d",&n,&k);
        printf("%d,%dn",k);

        if (n == 0 && k == 0)
            break;

        k = n > k? k: n;

        printf("Input num data:n");
        for (i = 0; i < n; i++)
        {
            scanf("%d",&S[i]);
        }

        k_num = find_k_num(S,k);
        printf("nThe K_Num is %d.n",k_num);
    }
}


后续

一个题复习了各种排序,这种题目蛮好的。网上还有各种优化的解法,后面再优化...

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读