寻找前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大数
常见解法
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); } } 后续
一个题复习了各种排序,这种题目蛮好的。网上还有各种优化的解法,后面再优化...
(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
相关内容
- ScriptException[scripts of type [inline], operation [up
- Perl问题打印输出到新文件
- 三个思路解决laravel上传文件报错:413 Request Entity Too
- 通过Thymeleaf模板使用Spring的主题解析器和主题
- Django Rest Framework源码剖析(一)-----认证
- LuaBoy编辑器开发日志-完成前段输入分割器
- 大数据揭秘:中国哪个姓氏最文(zhuang)艺(bi)
- delphi – SynEdit for Firemonkey?
- 如何让delphi的滚动条更宽/更大(包括滚动条的箭头)
- delphi – 如何在组件中添加对操作的支持