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.代码一运行结果