[英]How to determine the fastest sorting algorithm out of two?
我有兩種算法。
1。
void sort3(int *mass, int size)
{
int i = 0;
int j = size - 1;
int temp;
int mid = mass[size / 2];
do
{
while (mass[i] < mid)
{
i++;
}
while (mass[j] > mid)
{
j--;
}
if (i <= j)
{
temp = mass[i];
mass[i] = mass[j];
mass[j] = temp;
i++;
j--;
}
} while (i <= j);
if (j > 0)
{
sort3(mass, j + 1);
}
if (i < size)
{
sort3(&mass[i], size - i);
}
}
2。
void sort4_prepare(int *mass, int size)
{
int middle, start_left, start_right, last;
int *work_mas = new int[size];
middle = size / 2;
start_left = 0;
start_right = middle;
last = size;
for (int j = 0; j < last; j++)
{
if ((start_left < middle) && ((start_right >= last) || (mass[start_left] < mass[start_right])))
{
work_mas[j] = mass[start_left];
start_left++;
}
else
{
work_mas[j] = mass[start_right];
start_right++;
}
}
for (int j = 0; j < last; j++)
mass[j] = work_mas[j];
delete[] work_mas;
};
void sort4(int *mass, int size)
{
if (size > 1)
{
sort4(mass, size / 2);
sort4(&mass[size / 2], size - size / 2);
sort4_prepare(mass, size);
}
}
我也有一個從最大值到最小值排序的1000個隨機數的數組。 哪種算法可以更快地將數組從最小排序到最大? 我已經進行了一些測試,我認為這是第一個測試,但是我不知道如何證明它。 但是,在某些情況下,第二個會比第一個更快,這使我在測試中有些不確定。
sort3
是的一個實現快速排序 ,其具有在最壞情況下一個O(N²)時間復雜度,但平均O(nlogn)。
sort4
是的實現歸並無論是在最壞的和平均的情況下,其具有O(nlogn)的性能。
但是,這並不意味着即使在Quicksort最壞的情況下, sort4
也不能保證對1000個數字數組更快。 這僅意味着對於某些類別的數組(Quicksort的“最壞情況”類型的數組),存在一個數組大小, 在此大小以上, sort4
會更快。 平均而言,對任何數組進行排序所需的時間無法說,因為它們的平均時間復雜度相同。
此外,您不知道哪個大小大於Mergesort在Quicksort的“最壞情況”數組上的性能,因為這取決於實現問題:例如,一個編譯器可能以delete
操作的方式編譯代碼。 sort4
在時間上非常昂貴,因此對於大多數大小合理的數組, sort3
可能總是更快。 這並非sort4
,因為sort4
與sort3
確實不同,它需要創建一個額外的數組以將值復制到其中,然后再次刪除該數組。 這是sort3
沒有的開銷。
確定給定數組大小下一個函數的平均排序速度是否比另一個函數快的唯一實用方法是,獲得統計量度:對某些隨機填充的數組重復幾次代表代表性的排序操作,然后測量時間區別。 但是,在不同的配置上運行時,這種測試的結果可能會有所不同。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.