寻找第二小元素

来源:互联网 发布:微信能听的唱歌软件 编辑:程序博客网 时间: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.代码一运行结果
这里写图片描述