排序技术C
我从过去 7-8 个月开始编程,每当我想对数组或结构进行排序时,我通常都会使用选择排序。所以我有了想法并实施了它。选择排序在每个循环中找到最大或最小值并将其放置在边界之一(取决于最大值或最小值)并使其超出范围。所以我想为什么不在每个循环中找到最大和最小并将它们移动到边界(最小左和最大右)并将两边的范围缩小值 1。我猜它会有以前时间复杂度的一半。这是代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(){
int *a;
int n;
scanf("%d", &n);
a = malloc (n * sizeof (int));
for(int i = 0; i < n; i++)
scanf("%d", &a[i]);
int start = 0, end = n;
int temp;
while (start < end){
int max_index;
int min_index;
int max_num = INT_MIN, min_num = INT_MAX;
for (int i = start; start != end && i < end; i++){
if (a[i] > max_num){
max_num = a[i];
max_index = i;
}
if (a[i] < min_num) {
min_num = a[i];
min_index = i;
}
}
if ((max_index == start && min_index == end - 1) || (max_index == end - 1 && min_index == start)){
temp = a[end - 1]; //if max and min numbers are at border they will swap two times resulting in same location
a[end - 1] = a[max_index];
a[max_index] = temp;
} else {
temp = a[end - 1];
a[end - 1] = a[max_index];
a[max_index] = temp;
temp = a[start];
a[start] = a[min_index];
a[min_index] = temp;
}
start++;
end--;
}
for (int i = 0; i < n; i++)
printf("%d ", a[i]);
}
我用 600 个 int 值对其进行了测试,这是输出。它似乎工作正常。它比选择排序更好还是相同。我想 qsort 在速度和效率方面都优于两者。我在谷歌上寻找它并没有找到类似的代码,这让我想知道,这是否足够有效,或者我应该坚持使用选择排序和 qsort。
回答
我猜它的时间复杂度只有以前的一半。
O(0.5 * n^2) 仍然是 O(n^2)。好的qsort()预期为 O(n* ln(n))。
这是否足够有效,还是我应该坚持使用选择排序和 qsort。
很难打败许多程序员几十年的经验。
请记住qsort()不必使用快速排序算法。一个好的qsort()可能使用算法的组合。