计算排序算法中的执行时间 在C++中实现了合并排序和快速排序,我想使用两个文件中的每一个来执行执行时间,其中很多都是已经排序或不具有大小的情况。 #include <iostream> #include <ctime> #include <vector> #include <algorithm> using namespace std; void Merge(vector<int>& s, int low, int mid, int high) { int i = low; int j = mid + 1; int k = low; vector<int> u(s); while (i <= mid && j <= high) { if (s.at(i) < s.at(j)) { u.at(k) = s.at(i); i++; } else { u.at(k) = s.at(j); j++; } k++; } if (i > mid) { for (int a = j; a < high + 1; a++) { u.at(k) = s.at(a); k++; } } else { for (int a = i; a < mid + 1; a++) { u.at(k) = s.at(a); k++; } } for (int a = low; a < high + 1; a++) s.at(a) = u.at(a); } void MergeSort(vector<int>& s, int low, int high) { int mid; if (low < high) { mid = (low + high) / 2; MergeSort(s, low, mid); MergeSort(s, mid + 1, high); Merge(s, low, mid, high); } } void swap(int& a, int& b) { int tmp = a; a = b; b = tmp; } void Partition(vector<int>& s, int low, int high, int& pvpoint) { int j; int pvitem; pvitem = s.at(low); j = low; for (int i = low + 1; i <= high; i++) { if (s.at(i) < pvitem) { j++; swap(s.at(i), s.at(j)); } pvpoint = j; swap(s.at(low), s.at(pvpoint)); } } void QuickSort(vector<int>& s, int low, int high) { int pvpoint; if (high > low) { Partition(s, low, high, pvpoint); QuickSort(s, low, pvpoint - 1); QuickSort(s, pvpoint + 1, high); } } int main() { vector<int> CaseSize(20); for (int i = 0; i < 10; i++) { //10 Arrays those are sorted CaseSize.at(i) += (i + 1) * 500; } for (int i = 10; i < 20; i++) { //rest 10 those are not sorted CaseSize.at(i) += (i + 1) * 5000; } cout << "------------------Sorted------------------\n\n"; cout << " Quick Sort Merge Sort\n"; for (int i = 0; i < 10; i++) { vector<int> Arr(CaseSize.at(i)); Arr.front() = rand() % Arr.size(); for (int j = 1; j < Arr.size(); j++) { Arr.at(j) = ((17 * Arr.at(j - 1) + 43) % (Arr.size() * 5)); } vector<int> Arr2(Arr); sort(Arr.begin(), Arr.end()); sort(Arr2.begin(), Arr2.end()); cout << "N : " << CaseSize.at(i) << " "; clock_t start = (int)clock(); QuickSort(Arr, 0, Arr.size() - 1); printf("%0.5fms", (float)(clock() - start) / CLOCKS_PER_SEC); cout << "\t\t"; clock_t start2 = (int)clock(); MergeSort(Arr2, 0, Arr2.size() - 1); printf("%0.5fms", (float)(clock() - start) / CLOCKS_PER_SEC); cout << endl; } cout << endl; cout << "------------------Random------------------\n\n"; cout << " Quick Sort Merge Sort\n"; for (int k = 10; k < 20; k++) { vector<int> Arr(CaseSize.at(k)); Arr.front() = rand() % Arr.size(); for (int l = 1; l < Arr.size(); l++) { Arr.at(l) = ((17 * Arr.at(l - 1) + 43) % (Arr.size() * 5)); } vector<int> Arr2(Arr); cout << "N : " << CaseSize.at(k) << " "; clock_t start = (int)clock(); QuickSort(Arr, 0, Arr.size() - 1); printf("%0.5fms", (float)(clock() - start) / CLOCKS_PER_SEC); cout << "\t\t"; clock_t start2 = (int)clock(); MergeSort(Arr2, 0, Arr2.size() - 1); printf("%0.5fms", (float)(clock() - start) / CLOCKS_PER_SEC); cout << endl; } return 0; } #包括 #包括 #包括 #包括 使用名称空间std; 无效合并(矢量和s、整数低位、整数中档、整数高位){ int i=低; int j=mid+1; int k=低; 向量u(s); 虽然(i

计算排序算法中的执行时间 在C++中实现了合并排序和快速排序,我想使用两个文件中的每一个来执行执行时间,其中很多都是已经排序或不具有大小的情况。 #include <iostream> #include <ctime> #include <vector> #include <algorithm> using namespace std; void Merge(vector<int>& s, int low, int mid, int high) { int i = low; int j = mid + 1; int k = low; vector<int> u(s); while (i <= mid && j <= high) { if (s.at(i) < s.at(j)) { u.at(k) = s.at(i); i++; } else { u.at(k) = s.at(j); j++; } k++; } if (i > mid) { for (int a = j; a < high + 1; a++) { u.at(k) = s.at(a); k++; } } else { for (int a = i; a < mid + 1; a++) { u.at(k) = s.at(a); k++; } } for (int a = low; a < high + 1; a++) s.at(a) = u.at(a); } void MergeSort(vector<int>& s, int low, int high) { int mid; if (low < high) { mid = (low + high) / 2; MergeSort(s, low, mid); MergeSort(s, mid + 1, high); Merge(s, low, mid, high); } } void swap(int& a, int& b) { int tmp = a; a = b; b = tmp; } void Partition(vector<int>& s, int low, int high, int& pvpoint) { int j; int pvitem; pvitem = s.at(low); j = low; for (int i = low + 1; i <= high; i++) { if (s.at(i) < pvitem) { j++; swap(s.at(i), s.at(j)); } pvpoint = j; swap(s.at(low), s.at(pvpoint)); } } void QuickSort(vector<int>& s, int low, int high) { int pvpoint; if (high > low) { Partition(s, low, high, pvpoint); QuickSort(s, low, pvpoint - 1); QuickSort(s, pvpoint + 1, high); } } int main() { vector<int> CaseSize(20); for (int i = 0; i < 10; i++) { //10 Arrays those are sorted CaseSize.at(i) += (i + 1) * 500; } for (int i = 10; i < 20; i++) { //rest 10 those are not sorted CaseSize.at(i) += (i + 1) * 5000; } cout << "------------------Sorted------------------\n\n"; cout << " Quick Sort Merge Sort\n"; for (int i = 0; i < 10; i++) { vector<int> Arr(CaseSize.at(i)); Arr.front() = rand() % Arr.size(); for (int j = 1; j < Arr.size(); j++) { Arr.at(j) = ((17 * Arr.at(j - 1) + 43) % (Arr.size() * 5)); } vector<int> Arr2(Arr); sort(Arr.begin(), Arr.end()); sort(Arr2.begin(), Arr2.end()); cout << "N : " << CaseSize.at(i) << " "; clock_t start = (int)clock(); QuickSort(Arr, 0, Arr.size() - 1); printf("%0.5fms", (float)(clock() - start) / CLOCKS_PER_SEC); cout << "\t\t"; clock_t start2 = (int)clock(); MergeSort(Arr2, 0, Arr2.size() - 1); printf("%0.5fms", (float)(clock() - start) / CLOCKS_PER_SEC); cout << endl; } cout << endl; cout << "------------------Random------------------\n\n"; cout << " Quick Sort Merge Sort\n"; for (int k = 10; k < 20; k++) { vector<int> Arr(CaseSize.at(k)); Arr.front() = rand() % Arr.size(); for (int l = 1; l < Arr.size(); l++) { Arr.at(l) = ((17 * Arr.at(l - 1) + 43) % (Arr.size() * 5)); } vector<int> Arr2(Arr); cout << "N : " << CaseSize.at(k) << " "; clock_t start = (int)clock(); QuickSort(Arr, 0, Arr.size() - 1); printf("%0.5fms", (float)(clock() - start) / CLOCKS_PER_SEC); cout << "\t\t"; clock_t start2 = (int)clock(); MergeSort(Arr2, 0, Arr2.size() - 1); printf("%0.5fms", (float)(clock() - start) / CLOCKS_PER_SEC); cout << endl; } return 0; } #包括 #包括 #包括 #包括 使用名称空间std; 无效合并(矢量和s、整数低位、整数中档、整数高位){ int i=低; int j=mid+1; int k=低; 向量u(s); 虽然(i,c++,time-complexity,quicksort,mergesort,C++,Time Complexity,Quicksort,Mergesort,您的合并排序算法非常低效:merge在每次递归调用开始时复制整个数组,这是一个二次成本 在一些非常常见的情况下,快速排序实现在病态上也很慢:如果数组已经排序,则pivot值始终是切片中的最小元素,因此递归深度是数组的长度,如果不是堆栈溢出,则会得到二次时间复杂度 如果不衡量这些低效率是否会对性能造成最大的影响,就很难判断,但我猜MergeSort是输家 此外,如果要打印毫秒,请使用以下表达式: printf("%0.5fms", (clock() - start) * 1000.0 / CLOC

您的合并排序算法非常低效:
merge
在每次递归调用开始时复制整个数组,这是一个二次成本

在一些非常常见的情况下,快速排序实现在病态上也很慢:如果数组已经排序,则pivot值始终是切片中的最小元素,因此递归深度是数组的长度,如果不是堆栈溢出,则会得到二次时间复杂度

如果不衡量这些低效率是否会对性能造成最大的影响,就很难判断,但我猜
MergeSort
是输家

此外,如果要打印毫秒,请使用以下表达式:

printf("%0.5fms", (clock() - start) * 1000.0 / CLOCKS_PER_SEC);
要解决
合并
中的问题,请修改代码以创建正确大小的向量:

void合并(向量&s、整数低、整数中、整数高){
int i=低;
int j=mid+1;
int k=0;
矢量u(高+1-低);

而(我知道它打印了什么,你期望得到什么?
vector CaseSize(20)这是一个太小的测试用例。即使使用冒泡排序,所花费的时间也是瞬间的。你需要数千个元素,如果不是数百万个元素的话。要绘制时间复杂度,你需要N的多个值。这里只有一个。试着用20、200、2000、20000等等,每次增加10的幂。如果你想看到的话快速排序要慢得多,因为它的最坏情况是
O(n^2)
和合并排序
O(n*log(n))
。但这在随机测试中没有太大区别,因为快速排序的平均情况是
O(n*log(n))
还要确保您使用的是编译器优化,我非常感谢您的回答!!事实上,我想我仍然看不到这里的准确时间(我正在Putty和Visual Studio中尝试),所以我想我应该修理一下more@qkekehrtnfl97:精确计时代码是一门很难的艺术。在其他陷阱和陷阱中,您应该避免在所有测试完成之前产生输出。将经过的时钟值存储在一个数组中,并在所有测试完成后在循环中输出计时表。您还应该检查排序功能是否MPLET正确地检查数组是排序的。你也可以对C++的代码>排序> /COD>模板函数进行引用。