标签:排序 作者 复杂度 com pre 一点 最优 原因 理想
1 void merge(int arr[], int l, int m,int r) 2 { 3 int i = 0, j = 0, k =l; 4 int n1 = m - l + 1; //左边步长 5 int n2 = r - m; //右边步长 6 std::vector<int> vec_l(&arr[l], &arr[m+1]); 7 std::vector<int> vec_r(&arr[m+1], &arr[r+1]); 8 while (i < n1&&j < n2) 9 { 10 if (vec_l[i] <= vec_r[j]) 11 { 12 arr[k] = vec_l[i]; 13 i++; 14 } 15 else 16 { 17 arr[k] = vec_r[j]; 18 j++; 19 } 20 k++; 21 } 22 while (i<n1) 23 { 24 arr[k]= vec_l[i]; 25 i++; 26 k++; 27 } 28 29 while (j<n2) 30 { 31 arr[k] = vec_r[j]; 32 j++; 33 k++; 34 } 35 36 37 } 38 39 void mergeSort(int arr[], int l, int r) 40 { 41 if (l < r) 42 { 43 int m = l + (r - l) / 2; 44 45 mergeSort(arr, l, m); 46 mergeSort(arr, m + 1, r); 47 48 merge(arr, l, m, r); 49 } 50 }
再贴张排序的时间与空间复杂度的图
总结:
为什么堆排序的时间复杂度理想却很少被采用:
最差的情况就是每一次取到的元素就是数组中最小/最大的,这种情况其实就是冒泡排序了(每一次都排好一个元素的顺序),快速排序最差的情况下时间复杂度为:O( n^2 )
快排数据越无序越快(加入随机化后基本不会退化),平均常数最小,不需要额外空间,不稳定排序。
归排速度稳定,常数比快排略大,需要额外空间(还有个东西叫多路归并),稳定排序。(归并排序需要额外空间记录子数组的值)
------------------------------------------------------------------------
实际问题中归并排序并不比快排应用少。快排需要递归,就这一点基就可以在许多大数据应用场景把它枪毙了。而归并排序的scale能力比快排好很多,可以分布式处理,其实很受欢迎的
标签:排序 作者 复杂度 com pre 一点 最优 原因 理想
原文地址:https://www.cnblogs.com/wangshaowei/p/11379469.html