寻找第二小元素
来源:互联网 发布:微信能听的唱歌软件 编辑:程序博客网 时间:2024/04/28 19:01
1.思路
一次遍历找到数组中第二小的元素,采用双指针ptr1和ptr2分别指向当前最小和第二小的元素的地址,一次循环,i += 2;数组个数按照奇数偶数进行分类讨论。需要注意指针的使用,避免出现空指针和野指针。
2.代码
代码一:
#include <iostream>#include <vector>#include <ctime>#include <Windows.h>using namespace std;//随机初始化数组double[0, 100)template <typename T>void InitArr(T *nArr, int nLen) { srand(time(NULL)); for(int i = 0; i < nLen; ++i) {// nArr[i] = (rand() % 1000) * 1.0 / 10; nArr[i] = i; }}template <typename T>void PrintArr(T *nArr, int nLen) { for(int i = 0; i < nLen; ++i) { cout << nArr[i] << " "; } cout << endl;}template <typename T>void Swape(T *p1, T *p2) { T nTmp = *p1; *p1 = *p2; *p2 = nTmp;}template <typename T>void RandomSort(T *nArr, int nLen) { srand(time(NULL)); for(int i = 0; i < nLen; ++i) { int nIndex = rand() % nLen; Swape(&nArr[i], &nArr[nIndex]); } //Sleep(2000);}template <typename T>void CheckArr(T *nArr, int nLen) { for(int i = 1; i < nLen; ++i) { if(nArr[i - 1] > nArr[i]) { cout << "false" << endl; return; } } cout << "true" << endl;}void Min12(int *nArr, int nLen, int* ptr1, int* ptr2) { if(nLen == 0 || nLen == 1) return;// int *ptr1, *ptr2; if(nArr[0] > nArr[1]) { *ptr1 = nArr[1]; *ptr2 = nArr[0]; } else { *ptr1 = nArr[0]; *ptr2 = nArr[1]; } bool isodd = true; int nLast = nLen; if(nLen % 2 != 0) { isodd = false; nLast -= 1; } for(int i = 3; i < nLast; i += 2) { if(nArr[i] > nArr[i - 1]) { if(nArr[i - 1] < *ptr1) { *ptr2 = *ptr1; *ptr1 = nArr[i - 1]; } else if(nArr[i - 1] < *ptr2) { *ptr2 = nArr[i - 1]; } } else { if(nArr[i] < *ptr1) { *ptr2 = *ptr1; *ptr1 = nArr[i]; } else if(nArr[i] < *ptr2) { *ptr2 = nArr[i]; } } } if(!isodd) { if(nArr[nLen - 1] < *ptr1) { *ptr2 = *ptr1; *ptr1 = nArr[nLen - 1]; } else if(nArr[nLen - 1] < *ptr2) { *ptr2 = nArr[nLen - 1]; } }}int main() { int Len = 5; int Arr[Len] = {1, 0, 2, 8, 0}; PrintArr(Arr, Len);// InitArr(Arr, Len);// RandomSort(Arr, Len);// PrintArr(Arr, Len); int min1, min2; Min12(Arr, Len, &min1, &min2); cout << "min1: " << min1 << endl; cout << "min2: " << min2 << endl;}
代码二:
#include <iostream>#include <vector>#include <ctime>#include <Windows.h>using namespace std;//随机初始化数组double[0, 100)template <typename T>void InitArr(T *nArr, int nLen) { srand(time(NULL)); for(int i = 0; i < nLen; ++i) {// nArr[i] = (rand() % 1000) * 1.0 / 10; nArr[i] = i; }}template <typename T>void PrintArr(T *nArr, int nLen) { for(int i = 0; i < nLen; ++i) { cout << nArr[i] << " "; } cout << endl;}template <typename T>void Swape(T *p1, T *p2) { T nTmp = *p1; *p1 = *p2; *p2 = nTmp;}template <typename T>void RandomSort(T *nArr, int nLen) { srand(time(NULL)); for(int i = 0; i < nLen; ++i) { int nIndex = rand() % nLen; Swape(&nArr[i], &nArr[nIndex]); } //Sleep(2000);}template <typename T>void CheckArr(T *nArr, int nLen) { for(int i = 1; i < nLen; ++i) { if(nArr[i - 1] > nArr[i]) { cout << "false" << endl; return; } } cout << "true" << endl;}int* Min12(int *nArr, int nLen) { if(nLen == 0 || nLen == 1) return nullptr; int *ptr1, *ptr2; //注意此处的指针变量还没有赋初值 if(nArr[0] > nArr[1]) { ptr1 = &nArr[1]; //指针赋初值! ptr2 = &nArr[0]; //在指针(地址)没有初值的前提下不能进行指针指向对象的赋值操作 } else { //因此不能写成 *ptr1 = nArr[1] ptr1 = &nArr[0]; ptr2 = &nArr[1]; } bool isodd = true; int nLast = nLen; if(nLen % 2 != 0) { isodd = false; nLast -= 1; } for(int i = 3; i < nLast; i += 2) { if(nArr[i] > nArr[i - 1]) { if(nArr[i - 1] < *ptr1) { *ptr2 = *ptr1; *ptr1 = nArr[i - 1]; } else if(nArr[i - 1] < *ptr2) { *ptr2 = nArr[i - 1]; } } else { if(nArr[i] < *ptr1) { *ptr2 = *ptr1; *ptr1 = nArr[i]; } else if(nArr[i] < *ptr2) { *ptr2 = nArr[i]; } } } if(!isodd) { if(nArr[nLen - 1] < *ptr1) { *ptr2 = *ptr1; *ptr1 = nArr[nLen - 1]; } else if(nArr[nLen - 1] < *ptr2) { *ptr2 = nArr[nLen - 1]; } } return ptr2;}int main() { int Len = 10; int Arr[Len] = {0}; PrintArr(Arr, Len); InitArr(Arr, Len); RandomSort(Arr, Len); PrintArr(Arr, Len); int* min2; min2 = Min12(Arr, Len);// cout << "min1: " << min1 << endl; cout << "min2: " << *min2 << endl;}
3.代码一运行结果
阅读全文
0 0
- 寻找第二小元素
- 寻找第二小元素
- 寻找第二小的数
- 寻找第二小的数
- 寻找第k小元素
- 第二小元素
- 1070:寻找第二小的数
- 分治法 寻找第K小元素
- 寻找数组中第k小元素
- 算法:寻找第K小元素
- 小算法----寻找插入元素的位置
- 寻找数组中的第i小元素
- 寻找数组中第二大或第二小的数值
- 寻找数组中第二大或第二小的数值
- 寻找数组中第二大或第二小的数值
- 寻找前k大元素或者前k小元素
- 寻找n个元素中的第2小元素
- 序列中查找第二小元素
- Linux下 ln 命令详解
- json 和 java 对象 各种转换
- 理解MySQL——索引与优化
- 数据传输加密:非对称加密算法RSA+对称算法AES(适用于java,android和Web)
- Ubuntu新建用户
- 寻找第二小元素
- Python checkio Days Between解决方案
- HtmlAgilityPack使用(二)【爬取每日一文】
- 获取微信accessToken
- 第八周周总结
- leetcode 423. Reconstruct Original Digits from English 乱序英文字符串恢复数字
- 翻译连载 | 附录 C:函数式编程函数库-《JavaScript轻量级函数式编程》 |《你不知道的JS》姊妹篇
- spring4.x + hibernate4.x 配置详解
- CentOS 7最小化安装以后的配置