簡體   English   中英

如何優化隨機排序算法?

[英]How to optimize random sort algorithm?

這是我用C ++編寫的一些隨機排序程序。 對於10個左右的元素,它的效果很好。 但是對於15個元素,它是如此緩慢地工作,我什至都等不及要獲得結果。 有什么方法可以優化隨機排序算法?

這是我的代碼:

// randomsort.h

#ifndef RANDOMSORT_H
#define RANDOMSORT_H

#include <stdlib.h>
#include <time.h>

class RandomSort
{
private:
    template <class T>
    static bool isOrdered(T*, int);

public:
    template <class T>
    static int sort(T*, int);

};

template <class T>
bool RandomSort::isOrdered(T* arr, int size)
{
    for(int i = 1; i < size; i++)
    {
        if(arr[i-1] > arr[i])
        {
            return false;
        }
    }

    return true;
}

template <class T>
int RandomSort::sort(T* arr, int size)
{
    int stepAmount = 0;

    srand(time(NULL));

    while(!isOrdered(arr, size))
    {
        int i = rand() % size;
        int j = rand() % size;

        std::swap(arr[i], arr[j]);

        stepAmount++;
    }

    return stepAmount;
}

#endif // RANDOMSORT_H

和main.cpp文件

// main.cpp

#include <iostream>
#include "randomsort.h"

int main()
{
    int size;

    std::cout << "Enter amount of elements to sort: ";
    std::cin >> size;
    std::cout << std::endl;

    int arr[size];

    for(int i = 0; i < size; i++)
    {
        arr[i] = (rand() % (size * 10));
    }

    std::cout << "Input array: " << std::endl;

    for(int i = 0; i < size; i++)
        std::cout << arr[i] << ' ';

    std::cout << std::endl << std::endl;

    int stepAmount = RandomSort::sort(arr, size);

    std::cout << "Output array: " << std::endl;

    for(int i = 0; i < size; i++)
        std::cout << arr[i] << ' ';

    std::cout << std::endl << std::endl;

    std::cout << "Number of steps: " << stepAmount;

    return 0;
}

有什么建議么?

您的代碼是完全隨機的。 因此,它可以在不應該交換時進行交換。 一個簡單的解決方法是僅在需要時才進行交換。

int i = rand() % size;
int j = rand() % size;

// to know which should be first
if (i > j)
  std::swap(i, j);

if (arr[i] > arr[j])
    std::swap(arr[i], arr[j]);

您的數組可能不會立即排序,因此您也可以測試是否僅每5步(例如)而不是每步進行排序。

但是我認為最重要的是,您不應該期望這種算法具有良好的性能。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM