• new动态创建一维数组、qsort函数、折半查找


    new动态创建一维数组

    普通数组在栈上分配内存,栈很小;如果需要存放更多的元素,必须在堆上分配内存,堆很大

    动态创建一维数组的语法 : 数据类型 *指针 = new 数据类型[数组长度];

    释放一维数组的语法:delete [] 指针;

    注意:

    • 动态创建的数组没有数组名,不能用sizeof运算符。(动态创建的数组没有数组名,不能用sizeof,如果一定要用的话结果为8(64位),普通创建的可以用sizeof(数组名))
    • 可以用数组表示法和指针表示法两种方式使用动态创建的数组。
    • 必须使用delete[]来释放动态数组的内存。delete只会释放下标为0元素的空间。
    • 不要释放同一个内存块两次(否则等同于操作野指针),这个在之前的指针里面就讲过了。
    • 对空指针用delete[]是安全的(释放内存后,应该把指针置空nullptr)。
    • 声明普通数组的时候,数组长度可以用变量,相当于在栈上动态创建数组,并且不需要释放。
    • 如果内存不足,调用new会产生异常,导致程序中止;如果在new关键字后面加(std::nothrow)选项,则返回nullptr,不会产生异常。在后面的操作前面判断数组是否为nullptr。
    • 为什么用delete[]释放数组的时候,不需要指定数组的大小?因为系统会自动跟踪已分配数组的内存。
    • C语言里面的malloc函数不能用delete[],delete[]与new[]配对。
    • delete也不能释放栈上面的内存。
    1. #include
    2. using namespace std;
    3. int main()
    4. {
    5. int *arr = new int[10];
    6. for(int i = 0; i < 10; i++)
    7. {
    8. arr[i] = i; //数组表示
    9. cout<< "arr[" << i << "]=" << *(arr+i) <//指针表示
    10. }
    11. delete[]arr;
    12. }

    qsort函数

    qsort函数用于对各种数据类型的数组进行排序。

     函数原型:

    void qsort (void* base, size_t num, size_t size,
                int (*compar)(const void*,const void*));

            第一个参数:数组的起始地址。

            第二个参数:数组元素的个数(数组长度)。

            第三个参数:数组元素的大小(sizeof(数组的数据类型))。

            第四个参数:回调函数的地址。

    回调函数决定了排序的顺序,声明如下:

    int compar(const void *p1, const void *p2);

            1)如果函数的返回值< 0 ,那么p1所指向元素会被排在p2所指向元素的前面。

            2)如果函数的返回值==0,那么p1所指向元素与p2所指向元素的顺序不确定。

            3)如果函数的返回值> 0 ,那么p1所指向元素会被排在p2所指向元素的后面。

     qsort()函数的其它细节:

    • 形参中的地址用void是为了支持任意数据类型,在回调函数中必须具体化。
    • size_t是C标准库中定义的,在64位系统中是8字节无符号整型(unsigned long long)。
    • typedef unsigned long long size_t
    • 排序的需求除了升序和降序,还有很多不可预知的情况,只能用回调函数。
    1. #include // 包含头文件。
    2. using namespace std; // 指定缺省的命名空间。
    3. int compasc(const void* p1, const void* p2) // 升序的回调函数。
    4. {
    5. return *((int*)p1) - *((int*)p2);
    6. }
    7. int compdesc(const void* p1, const void* p2) // 降序的回调函数。
    8. {
    9. return *((int*)p2) - *((int*)p1);
    10. }
    11. int main()
    12. {
    13. int a[8] = { 4,2,7,5,8,6,1,3 };
    14. qsort(a,sizeof(a)/sizeof(int),sizeof(int),compasc); // 对数组a进行升序排序。
    15. for (int i = 0; i < 8; i++)
    16. {
    17. cout << "a[" << i << "]=" << a[i] << endl;
    18. }
    19. qsort(a, sizeof(a) / sizeof(int), sizeof(int), compdesc); // 对数组a进行降序排序。
    20. for (int i = 0; i < 8; i++)
    21. {
    22. cout << "a[" << i << "]=" << a[i] << endl;
    23. }
    24. }

     折半查找

    折半查找也叫二分查找,只适用于已排序的数组(升序降序都可以)。

    1. #include // 包含头文件。
    2. using namespace std; // 指定缺省的命名空间。
    3. // 在arr中查找key,成功返回key在arr中的数组下标,失败返回-1。
    4. int search(int arr[], int len, int key)
    5. {
    6. int low = 0, high = len-1, mid; // 初始化:low=0,high=数组长度-1。
    7. while (low <= high)
    8. {
    9. mid = (low + high) / 2; // 计算mid指针的位置。
    10. if (arr[mid] == key) return mid; // 查找成功。
    11. else if (arr[mid] > key) high = mid - 1; // 继续在前半区查找。
    12. else low = mid + 1; // 继续在后半区查找。
    13. }
    14. return -1; // 查找失败。
    15. }
    16. int main()
    17. {
    18. int a[10] = { 7,9,12,16,21,25,30,35,41,48 }; // 必须是已排好序的数组。
    19. if (search(a, 10, 30) >= 0) cout << "在数组a中查找成功。\n";
    20. else cout << "在数组a中查找失败。\n";
    21. }

  • 相关阅读:
    设计一个简单的通讯录
    Java语言基础第四天
    “可信区块链运行监测服务平台TBM发展研讨会”将于11月23日在北京召开
    【算法练习Day13】二叉树的层序遍历&&翻转二叉树&&对称二叉树
    linux 进程管理
    亚马逊API接口解析,实现获得AMAZON商品详情
    什么是js?(初步了解)
    Web 自动化神器 TestCafe—页面高级操作篇
    30行代码做一个简易的抽奖系统(一)
    Kali-linux Arpspoof工具
  • 原文地址:https://blog.csdn.net/m0_62853489/article/details/127443880