我的排序算法的空间和时间复杂度是多少?

时间:2015-04-29 18:15:44

标签: algorithm sorting time

下面给出的代码是我希望有人帮助我弄清楚时间和空间的复杂性,请记住,它们都只依赖于给定程序的“排序算法代码”。
请记住,没有。您可以作为输入的列应该是一个不包括1的奇数,并且由于代码的排序方式,偶数列将产生错误的结果。
当被要求输入“常数乘数”时,您需要输入这些测试数字,这有助于对2D数组进行排序: 1.对于100个元素,列= 33,常数乘数= 4,
2.对于200个元素,列= 67,常数乘数= 10,
3.对于300个元素,列= 101,常数乘数= 15,
4.对于400个元素,列= 133,常数乘数= 15,
5.对于500个元素,列= 167,常数乘数= 25,
6.对于30000个元素,列= 9999,常数乘数= 2500 等..等等。

我还想接受来自其他地方保存的.txt文件的输入。我该怎么办? 干杯。谢谢你和我一起玩:)

守则:

#include<iostream>
#include<conio.h>
#include<stdio.h>
#include<fstream>

using namespace std;

void main()
{
system("cls");
int col;
int d;
int cons=1;
A:
cout << endl;
int a[3][40000] = { {0} };//Initializing the array to 0
cout << "enter no. of columns:";//No. of Columns for the 3xN matrix
cin >> col;
int noe = col * 3;//Total No. of Elements

//Code to accept the constant multiplier
cout << "Enter the constant multiplier:";
cin >> cons;

//Code to generate a list of random integers and store it in the array 
for (int i = 0; i < col;i++)
for (int j = 0; j < 3; j++)
{
    d = rand() % 9000;
    a[j][i] = d; 
}


int k = 0;
int temp;//Temporary Storage
int flag = 0;


//Sorting algorithm 
for (int n = 0; n <= noe*cons; n++)
{
    if ((k % 2 == 0) && (flag == 0))
    {
        //Sorting Upper Triangle
        //3 row check
        if (a[0][k]>a[0][k + 1])
        {
            temp = a[0][k + 1];
            a[0][k + 1] = a[0][k];
            a[0][k] = temp;
        }

        if (a[1][k] > a[1][k + 1])
        {
            temp = a[1][k + 1];
            a[1][k + 1] = a[1][k];
            a[1][k] = temp;
        }

        if (a[2][k] > a[0][k + 2])
        {
            temp = a[0][k + 2];
            a[0][k + 2] = a[2][k];
            a[2][k] = temp;
        }

        //First Column Check
        {
            if (a[0][k] > a[1][k])
            {
                temp = a[1][k];
                a[1][k] = a[0][k];
                a[0][k] = temp;
            }

            if (a[1][k] > a[2][k])
            {
                temp = a[2][k];
                a[2][k] = a[1][k];
                a[1][k] = temp;
            }

            if (a[0][k] > a[1][k])
            {
                temp = a[1][k];
                a[1][k] = a[0][k];
                a[0][k] = temp;
            }

        }
        //Second Column Check
        {
            if (a[0][k + 1] > a[1][k + 1])
            {
                temp = a[1][k + 1];
                a[1][k + 1] = a[0][k + 1];
                a[0][k + 1] = temp;
            }

            if (a[1][k + 1] > a[0][k + 2])
            {
                temp = a[0][k + 2];
                a[0][k + 2] = a[1][k + 1];
                a[1][k + 1] = temp;
            }

            if (a[0][k + 1] > a[1][k + 1])
            {
                temp = a[1][k + 1];
                a[1][k + 1] = a[0][k + 1];
                a[0][k + 1] = temp;
            }
        }

        //3 Diagonal Checks
        if (a[0][k + 1] < a[1][k])
        {
            temp = a[1][k];
            a[1][k] = a[0][k + 1];
            a[0][k + 1] = temp;
        }
        if (a[2][k] > a[1][k + 1])
        {
            temp = a[1][k + 1];
            a[1][k + 1] = a[2][k];
            a[2][k] = temp;
        }
        if (a[2][k] > a[0][k + 1])
        {
            temp = a[0][k + 1];
            a[0][k + 1] = a[2][k];
            a[2][k] = temp;
        }    
        //Upper Triangle Sorted
        k = k + 2;
        if (k == (col - 1))flag = 1;
    }

    else if ((k % 2 == 0) && (flag == 1))
    {
        //Sorting Lower Triangle
        //3 row check
        if (a[2][k - 2]>a[0][k])
        {
            temp = a[0][k];
            a[0][k] = a[2][k - 1];
            a[2][k - 2] = temp;
        }

        if (a[1][k - 1] > a[1][k])
        {
            temp = a[1][k];
            a[1][k] = a[1][k - 1];
            a[1][k - 1] = temp;
        }

        if (a[2][k - 1] > a[2][k])
        {
            temp = a[2][k];
            a[2][k] = a[2][k - 1];
            a[2][k - 1] = temp;
        }

        //First Column Check
        {
            if (a[2][k - 2] > a[1][k - 1])
            {
                temp = a[1][k - 1];
                a[1][k - 1] = a[2][k - 2];
                a[2][k - 2] = temp;
            }

            if (a[1][k - 1] > a[2][k - 1])
            {
                temp = a[2][k - 1];
                a[2][k - 1] = a[1][k - 1];
                a[1][k - 1] = temp;
            }

            if (a[2][k - 2] > a[1][k - 1])
            {
                temp = a[1][k - 1];
                a[1][k - 1] = a[2][k - 2];
                a[2][k - 2] = temp;
            }

        }

        //Second Column Check
        {
            if (a[0][k] > a[1][k])
            {
                temp = a[1][k];
                a[1][k] = a[0][k];
                a[0][k] = temp;
            }

            if (a[1][k] > a[2][k])
            {
                temp = a[2][k];
                a[2][k] = a[1][k];
                a[1][k] = temp;
            }

            if (a[0][k] > a[1][k])
            {
                temp = a[1][k];
                a[1][k] = a[0][k];
                a[0][k] = temp;
            }
        }

        //3 Diagonal Checks
        if (a[0][k] < a[1][k - 1])
        {
            temp = a[1][k - 1];
            a[1][k - 1] = a[0][k];
            a[0][k] = temp;
        }
        if (a[2][k - 1] > a[1][k])
        {
            temp = a[1][k];
            a[1][k] = a[2][k - 1];
            a[2][k - 1] = temp;
        }
        if (a[2][k - 1] > a[0][k])
        {
            temp = a[0][k];
            a[0][k] = a[2][k - 1];
            a[2][k - 1] = temp;
        }
        //Lower Triangle Sorted
        k = k - 2;
        if (k == 0)flag = 0;
    }


}


//Code to print the sorted elements
cout << "Sorted Elements:" << endl;

for (int i = 0; i < col; i++)
for (int j = 0; j < 3; j++)
{
    cout << a[j][i] << " ";
}

//Code to check if the elements are sorted or not
int l = 0;
int s = a[0][0];
for (int i = 0; i < col;i++)
for (int j = 0; j < 3; j++)
{
    if (s > a[j][i])l++;
    s = a[j][i];
}

if (l == 0)cout << "\nSorted Array!\n";
else cout << "\nUnsorted!\n";

system("pause");
goto A;

}

1 个答案:

答案 0 :(得分:1)

通过算法,如果我们将常数因子视为常数(你有一个C * n迭代的循环),那么最初看起来这是一个O(n)时间复杂度排序算法,但是{ {3}}。这或者意味着a。你没有成功地对传统意义上的数据进行排序(我假设情况并非如此),b。你正在做一个非比较排序(看起来你正在进行比较排序),或者c。恒定因子不能被视为常数(这几乎肯定是这种情况,特别是因为较大输入的常数因子较大)。

你如何确定常数因子?它与输入大小的关系是什么?您需要确定的内容(例如,我在评论中描述的统计数据)是这种关系是否是例如“常数因子= C * log(输入大小)”,或“常数因子= C *(输入大小)”,或介于两者之间。

空间复杂性似乎是一个常量,因为你没有动态分配任何内存或使用交换数组或类似的东西,也没有使用递归。