将一个二维数组排序到一维数组

8人阅读 评论(0) 收藏 举报
分类:

题目描述

给你一个二维数组,请将它排序到一个一维数组,
int* MySort(int** source, int* len,int n, int* output)

思路

将结果一维数组指针返回是一种链式编程思想,例如a = sort(a,sort(b,c))这样。然后形参给了一个指向一个指针的数组,所以这个二维数组在内存中不是连续分配的,然后还给你一个每行的长度。
- 我先想到将每一行快排,然后将每一行两两合并,就像mergesort样,但是这并没有降低算法的时间复杂度,注意这个解法的算法复杂度一般不会超过nlgn,要不然将一个一维数组切成几段就可以超过nlgn,干嘛还要快排是吧。
所以我认为这个就是一个变种的考排序算法的题目,顺便检查你的C++编程基本功。在写完后,面试官可能会问一下八种排序算法的优劣。
注意这里的output要在使用MySort函数前分配好足够的地址空间,或者使用全局变量也行。我这里给出一个使用冒泡排序的写法。当然你还可以选择其它的nlgn排序算法。注意,使用排序算法的时候一定结合具体条件来选择合适的算法,这个可以和面试官讲清楚。

#include <iostream>
using namespace std;

int res1[1000];

int* MySort(int** source, int* len,int n, int* output)
{
    if(source == nullptr || *source == nullptr || len == nullptr || n < 1 || output == nullptr)
        return nullptr;

    int totalLen = 0;
    for(int i = 0; i < n; ++i)
        totalLen += len[i];

    //output = new int[totalLen];   这是错误的,把地址赋给了一个局部变量
    int* res  = output;
    int count = 0;

    for(int i = 0; i < n; ++i)
        for(int j = 0; j < len[i]; ++j)
        {
            output[count++] = *(*(source+i)+j);
        }

    for(int i = 0; i < totalLen - 1; ++i)
    {
        for(int j = 0; j < totalLen - i - 1; ++j)
        {
            if(output[j] > output[j+1])
            {
                swap(output[j+1],output[j]);
            }
        }
    }

    return res;
}

int main()
{
    int a[3] = {5,7 ,3};
    int b[2] = {7,3};
    int len[2] = {3,2};
    int* pa = a;
    int* pb = b;
    int* pp[2] = {pa,pb};
    //int* res1 = new int[5];
    int* res2 = nullptr;
    res2= MySort(pp, len, 2, res1);
    for(int i = 0;i < 5;++i)
    {
        cout<<"res1:"<<res1[i] << "res2:"<<res2[i]<<endl;
    }
    return 0;
}

使用各排序算法的情形

  • 插入、冒泡排序的速度较慢,但参加排序的序列局部或整体有序时,这种排序能达到较快的速度。
    反而在这种情况下,快速排序慢了。 当n较小时,对稳定性不作要求时宜用选择排序,对稳定性有要求时宜用插入或冒泡排序。
  • 若待排序的记录的关键字在一个明显有限范围内时,且空间允许时用桶排序。
  • 当n较大时,关键字元素比较随机,对稳定性没要求宜用快速排序。
  • 当n较大时,关键字元素可能出现本身是有序的,对稳定性有要求时,空间允许的情况下宜用归并排序。
  • 当n较大时,关键字元素可能出现本身是有序的,对稳定性没有要求时宜用堆排序。
  • 快排在数组情况下,由于计算机内存访问局部性原理,会比归并在这方面更快,而在链表中,这种优势不再存在,
    加上归并空间复杂度变为O(1)和快排的稳定性,所以一般在链表排序中都使用归并排序。

参考BLOG

查看评论

将一个二维数组合并成一个一维数组

大家都知道php有内置的数组合并函数array_merage($arr,$arr1,$arr2,$arr3);那如何把一个二维数组如array(array('a'=>1,'b'=>2),array('...
  • xingjigongsi
  • xingjigongsi
  • 2014-10-09 20:26:42
  • 4324

一维数组排序方法

数组排序的三种方法分析 一、利用冒泡法对N个数排序算法步骤如下: 算法分析:如果有n个数,则要进行n-1趟比较。在第1趟比较中要进行n-1次相邻元素的两两比较,在第j趟比较中要进行n...
  • kongweishang3
  • kongweishang3
  • 2015-12-18 11:30:22
  • 3445

JAVA中对一维数组排序的方法(在快速排序上进行的优化)

对于搞算法的人经常使用到快排(快速排序的简称), 对于C++中的sort(,,)来说是快排的方法,相对来说对于JAVA来说,也有快排的调用, 这里的方法是 Arrays.sort(数组名字); ...
  • u012965373
  • u012965373
  • 2015-02-07 17:55:37
  • 1869

一维数组的冒泡排序

#include //冒泡排序 int main(void){ int nums[] = {23,14,76,53,29}; int LEN = sizeof(nums)/ sizeo...
  • DucklikeJAVA
  • DucklikeJAVA
  • 2017-03-19 15:52:30
  • 1251

1119: 一维数组排序

1119: 一维数组排序 Time Limit: 1 Sec  Memory Limit: 128 MB Submit: 5841  Solved: 3138 SubmitStatusWeb...
  • zzuli_Acmer
  • zzuli_Acmer
  • 2017-11-06 16:26:17
  • 549

java一维数组排序及算法

package com.axesline.sun; import java.util.Random; public class getMaxMin_Number {      public st...
  • suenpeng
  • suenpeng
  • 2016-08-02 09:30:05
  • 661

PHP常用一维数组排序

  • lz0426001
  • lz0426001
  • 2014-11-25 17:09:05
  • 662

PHP一维数组、二维数组排序

1、一维数组 结构: {     "data": [         {             "id": 1,             "name": "套餐一",         ...
  • chajinglong
  • chajinglong
  • 2017-06-22 17:20:36
  • 244

PHP程序开发之一维数组排序

使用以下函数能够对数组中的元素以字母或数字顺序进行升序或降序排序: sort() - 以升序对数组排序 rsort() - 以降序对数组排序 asort() - 根据值,以升序对关联数组进行排序...
  • lih062624
  • lih062624
  • 2017-04-17 14:04:23
  • 2616

【郑轻oj】1119 - 一维数组排序(sort快排)

1119: 一维数组排序 Time Limit: 1 Sec  Memory Limit: 128 MB Submit: 3097  Solved: 1620 SubmitStatusWeb Bo...
  • Bear1998
  • Bear1998
  • 2016-01-17 20:02:29
  • 754
    个人资料
    持之以恒
    等级:
    访问量: 8676
    积分: 615
    排名: 8万+
    最新评论