“求一列数中的第二小的数”
来源:互联网 发布:韩国人评论上瘾网络剧 编辑:程序博客网 时间:2024/06/03 17:26
问题:求一列数中的第二小的数
方法:分治法,二分法,每次保留最小的两个数据
#include <stdio.h>
#include <stdlib.h>
#include<iostream>
float a[100];
void two (int i, int j, float &fmin2, float &fmin1)
{
float lmin2, lmin1, rmin2, rmin1;
int mid;
if (i==j)
{
fmin2=a[i];
fmin1=a[i];
}
else if (i==j-1)
if (a[i]<a[j])
{ fmin2=a[j]; fmin1=a[i];}
else
{ fmin2=a[i]; fmin1=a[j]; }
else
{
mid=(i+j)/2;
two (i, mid, lmin2, lmin1);
two (mid+1, j, rmin2, rmin1);
if (lmin1<rmin1)
if(lmin2<rmin1)
{ fmin1=lmin1; fmin2=lmin2; }
else
{ fmin1=lmin1; fmin2=rmin1;}
else
{
if (rmin2<lmin1)
{ fmin1=rmin1; fmin2=rmin2; }
else
{ fmin1=rmin1; fmin2=lmin1;}
}
}
}
float second (int n)
{
float min2, min1;
two(0, n-1, min2, min1);
return min2;
}
int main( )
{
int i, n=4;
float min2;
for (i=0;i<n;i++)
scanf("%f", &a[i]);
min2=second(n);
printf("%f\n", min2);
system ("pause");
return 0;
}
问题:求一列数中的第 K 小的数
方法:分治法,二分法,每次保留最小的两个数据
#include <stdio.h>
#include <stdlib.h>
//#include<iostream>
#define n 6
int a[n]={3, 2, 7, 4, 1, 5};
void Swap(int &x, int &y)
{ int t; t=x; x=y; y=t; }
int select(int a[ ], int left, int right, int k) //在a [ left : right ]中选择第k小的元素/
{
int i, j, pivot;
if (left >= right) return a[left];
i = left; //从左至右的指针
j = right+1; // 从右到左的指针
pivot = a[left]; //把最左面的元素作为分界数据
while (1)
{
do
{ // 在左侧寻找>= pivot 的元素
i = i + 1;
printf("i= %d a[%d]= %d\n", i, i, a[i]);
} while (a[i] < pivot && i<5);
do
{
j = j - 1;
printf("j= %d a[%d]= %d\n", j, j, a[j]);
} while (a[j] > pivot && j<6); // 在右侧寻找<= pivot 的元素
printf("i= %d, j= %d \n",i, j);
printf("交换前 i= %d j=%d a[%d]= %d a[%d]= %d\n", i, j, i, a[i], j, a[j]);
if (i >= j) break; // 未发现交换对象
Swap(a[i], a[j]);
printf("交换后 i= %d j=%d a[%d]= %d a[%d]= %d\n", i, j, i, a[i], j, a[j]);
for (int i=0; i<n; i++)
printf("a[%d]= %d ", i, a[i]);
printf("\n\n");
}
if (j - left + 1 == k)
return pivot;
printf("第二次交换后:\n");
for (int i=0; i<n; i++)
printf("a[%d]= %d ", i, a[i]);
printf("\n");
a[left] = a[j]; // 设置pivot
a[j] = pivot;
printf("@@@@@@@ \n");
for (int i=0; i<n; i++)
printf("a[%d]= %d ", i, a[i]);
printf("\n");
if (j - left + 1 < k) // 对一个段进行递归调用
return select(a, j+1, right, k-j-1+left);
else
return select(a, left, j-1, k);
}
int main( )
{
int k=6, mink;
//int a[6]={3, 2, 7, 4, 1, 5}; // 1 2 3 4 5 7;
if (k < 1 || k >n)
printf("Input error!\n");
else
{ mink=select(a, 0, n-1, k);
printf("第 %d 小的数据是 mink= %d\n", k, mink);
}
system ("pause");
return 0;
}
- “求一列数中的第二小的数”
- 求一列数的全排列
- 求一列数的第k大的数
- 求一列数前m大的数
- 求数组第二小的数的函数
- 求一组数的第二小的数据
- 求n个整数中第二小的数
- 求一个数组中的第二大的数?
- 寻找第二小的数
- 寻找第二小的数
- 求一列数一阶差分的和
- 求数组中的第K小的数
- 求数组第二小的数和第二大数的下标
- 求四个数中的最大的数
- 求数组里面第二大的数
- 求数组里面第二大的数
- 求数组中第二大的数
- 求数组中第二大的数
- demo online
- mysql5.7新特性
- leetcode之Validate Binary Search Tree
- Mysql数据库名和表名的大小写敏感性问题
- 脚本
- “求一列数中的第二小的数”
- 找到数组中重复的和丢失的元素
- 二、文件与目录
- 调试的错误就是编程给你最好的东西,因为在每个错误上面都标志着前进的一步
- leetcode 287 Find the Duplicate Number
- 如果我来应聘产品经理岗位(二)
- nginx学习(五) http模块
- jquery瀑布流下拉加载(position定位版)
- 数组指针和指针数组