几种排序的性能测试

几种排序的性能测试

     闲的无聊,预习数据结构的时候看到了几种排序的性能分析,就自己做了一下。
    测试结果如下:单位(ms)  RE:用时过长或爆栈


 

可见,快排在完全随机的数据下性能是最优的,在已经排序或者已经基本排序的前提下,即使是加了随机化的快排也会很慢,堆排在已经排序的情况下比随机情况下快了一倍多,归排也是,而且速度比堆排很多在各个情况下都很高效C++自带的sort函数只有在已经排序的情况下是最快的(接近O(n)其他时候的速度并不是最快的但效率依旧很高。

 快排的三者取中的优化在数据是顺序的情况下较快但在逆序的情况下很慢,随机化在顺序情况下较慢在逆序情况下较快普通快排在数据基本排序的前提下基本O(n^2)的.

lc思念落叶
2014/12/28 


C++中有多种常见的排序算法,如冒泡排序、选择排序、插入排序、快速排序、归并排序和堆排序等。它们各有优缺点,适用于不同的场景。下面是简短的描述及部分示例代码: 1. **冒泡排序**: - 性能较差,时间复杂度为O(n^2)。 ```cpp void bubble_sort(int arr[], int n) { for (int i = 0; i < n - 1; ++i) { for (int j = 0; j < n - i - 1; ++j) { if (arr[j] > arr[j + 1]) { std::swap(arr[j], arr[j + 1]); } } } } ``` 2. **选择排序**: - 相同的时间复杂度O(n^2),不适合大型数据集。 ```cpp void selection_sort(int arr[], int n) { for (int i = 0; i < n - 1; ++i) { int min_idx = i; for (int j = i + 1; j < n; ++j) { if (arr[j] < arr[min_idx]) { min_idx = j; } } std::swap(arr[i], arr[min_idx]); } } ``` 3. **插入排序**: - 对于小规模数据和基本有序的数据,效率较高,平均时间复杂度O(n^2)。 ```cpp void insertion_sort(int arr[], int n) { for (int i = 1; i < n; ++i) { int key = arr[i]; int j = i - 1; while (j >= 0 && arr[j] > key) { arr[j + 1] = arr[j]; j -= 1; } arr[j + 1] = key; } } ``` 4. **快速排序**: - 平均时间复杂度O(n log n),是一种高效的通用排序算法。 ```cpp void quick_sort(int arr[], int low, int high) { if (low < high) { int pi = partition(arr, low, high); quick_sort(arr, low, pi - 1); quick_sort(arr, pi + 1, high); } } // 冒泡分区 int partition(int arr[], int low, int high) { int pivot = arr[high]; int i = (low - 1); for (int j = low; j <= high - 1; j++) { if (arr[j] < pivot) { i++; std::swap(arr[i], arr[j]); } } std::swap(arr[i + 1], arr[high]); return (i + 1); } ``` 5. **归并排序**: - 时间复杂度稳定在O(n log n),适合大数据处理。 ```cpp void merge_sort(int arr[], int l, int r) { if (l < r) { int m = l+(r-l)/2; merge_sort(arr, l, m); merge_sort(arr, m+1, r); merge(arr, l, m, r); } } void merge(int arr[], int l, int m, int r) { int n1 = m - l + 1; int n2 = r - m; int L[n1], R[n2]; for (int i = 0; i < n1; i++) L[i] = arr[l + i]; for (int j = 0; j < n2; j++) R[j] = arr[m + 1+ j]; int i = 0, j = 0, k = l; while (i < n1 && j < n2) { if (L[i] <= R[j]) { arr[k] = L[i]; i++; } else { arr[k] = R[j]; j++; } k++; } while (i < n1) { arr[k] = L[i]; i++; k++; } while (j < n2) { arr[k] = R[j]; j++; k++; } } ``` 6. **堆排序**: - 时间复杂度O(n log n),适合需要原地排序的情况。 ```cpp void heapify(int arr[], int n, int i) { int largest = i; int left = 2 * i + 1; int right = 2 * i + 2; if (left < n && arr[left] > arr[largest]) largest = left; if (right < n && arr[right] > arr[largest]) largest = right; if (largest != i) { std::swap(arr[i], arr[largest]); heapify(arr, n, largest); } } void heapSort(int arr[], int n) { for (int i = n / 2 - 1; i >= 0; i--) heapify(arr, n, i); for (int i=n-1; i>=0; i--) { std::swap(arr[0], arr[i]); heapify(arr, i, 0); } } ``` 注意:这些只是排序算法的基本版本,实际应用中可能会有额外的优化。在评估性能时,通常会考虑数据规模、是否稳定、空间需求等因素,并通过基准测试工具(如`std::sort`或其他第三方库)来对比各算法的实际运行速度。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值