排序算法总结(二)——快速排序、归并排序
来源:互联网 发布:js阻止用户关闭浏览器 编辑:程序博客网 时间:2024/05/02 01:49
快速排序
排序思想:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。其中,个人认为如何将数据按key排放这一步骤最为重要,理解了这里,整个算法应该就明白了。
排序实例:49 38 65 97 76 13 27
进行第一次交换后:27 38 65 97 76 13 49 ( 按照算法的第三步从后面开始找,此时:J=6)
进行第二次交换后:27 38 49 97 76 13 65 ( 按照算法的第四步从前面开始找>key的值,65>49,两者交换,此时:I=2 )
进行第三次交换后:27 38 13 97 76 49 65 ( 按照算法的第五步将又一次执行算法的第三步从后开始找
进行第四次交换后:27 38 13 49 76 97 65 ( 按照算法的第四步从前面开始找大于key的值,97>49,两者交换,此时:I=3,J=5 )
此时再执行第三和四步的时候就发现I=J=4,从而结束一趟快速排序,那么经过一趟快速排序之后的结果是:27 38 13 49 76 97 65,即所有大于key49的数全部在49的后面,所有小于key(49)的数全部在key(49)的前面。
是否稳定:否。
时间复杂度:平均时间复杂度Ο(n log n) ,最坏为O(n^2)。
void swap(int *pLeft,int *pRight){int temp;temp = *pLeft;*pLeft= *pRight;*pRight = temp;}void my_quick_sort(int a[], int begin, int end){int compare=a[begin], left =begin,right = end;if(left > right) return;while(left < right){while ((left < right) && (a[right] >= compare))right--;swap(&a[left], &a[right]);while ((left < right) && (a[left] <= compare))left++;swap(&a[left], &a[right]);}my_quick_sort(a, begin, left-1);my_quick_sort(a, left+1, end);}
归并排序
排序思想:归并(Merge)排序法是将两个(或两个以上)有序表合并成一个新的有序表,即把待排序序列分为若干个子序列,每个子序列是有序的。然后再把有序子序列合并为整体有序序列。
是否稳定:稳定。
时间复杂度:O(n*logn)。
void mergearray(int a[], int first, int mid, int last, int temp[]){int i = first, j = mid + 1;int m = mid, n = last;int k = 0;while (i <= m && j <= n){if (a[i] <= a[j])temp[k++] = a[i++];elsetemp[k++] = a[j++];}while (i <= m)temp[k++] = a[i++];while (j <= n)temp[k++] = a[j++];for (i = 0; i < k; i++)a[first + i] = temp[i];}void mergesort(int a[], int first, int last, int temp[]){if (first < last){int mid = (first + last) / 2;mergesort(a, first, mid, temp); //左边有序mergesort(a, mid + 1, last, temp); //右边有序mergearray(a, first, mid, last, temp); //再将二个有序数列合并}}bool MergeSort(int a[], int n){int *p = new int[n];if (p == NULL)return false;mergesort(a, 0, n - 1, p);delete[] p;return true;}
注:文中部分代码参考了其他博文。
- 排序算法总结(二)——快速排序、归并排序
- 排序算法二(归并排序、快速排序、希尔排序)
- 排序算法(2)—归并排序,快速排序
- 排序算法二之快速 归并排序
- 排序算法(二):快速,归并,堆排序
- 排序算法总结之快速排序、归并排序、shell排序
- 排序算法总结——归并排序
- 常用排序算法——插入排序,快速排序,归并排序,堆排序,计数排序
- 排序算法总结(二)归并法
- 排序算法(二)—归并排序(Merge sort)
- 排序算法总结(二)-------选择,堆,冒泡,快速,归并排序(java实现)
- 排序算法总结(4)——归并排序
- JavaScript排序算法(希尔排序、快速排序、归并排序)
- 算法导论-插入排序,归并排序,快速排序总结
- 排序算法总结(归并排序、快速排序)(python实现)
- Javascript数据结构算法之排序二(希尔排序,归并排序,快速排序)
- 比较排序总结——直接插入排序,希尔排序,选择排序,堆排序,冒泡排序,快速排序,归并排序
- 排序算法—归并排序
- PowerDesigner使用教程 —— 概念数据模型
- 谁能在移动支付的大潮中成为赢家?
- codeforces Round #92 D——后缀自动机
- iOS设备中WiFi、蓝牙和飞行模式的开启与关闭
- 让你拥有超常记忆力的小习惯
- 排序算法总结(二)——快速排序、归并排序
- 如何清晰地思考
- ubuntu安装 搜狗输入法 linux版 2013年最新教程 原创首发!!!
- 十四个很准的心里暗示。。。
- Ajax中XMLHttpRequest对象的ReadyState属性值列表
- 编码问题,UTF,ISO8859-1,unicode,ACSii,GBK之间的区别
- HTML学习笔记(十五)HTML Iframe
- 困惑人生30个问题的回答
- 10878 - Decode the tape