[关闭]
@tankle 2015-08-02T08:43:12.000000Z 字数 3709 阅读 1632

7大排序算法及其比较

工作


7大排序算法比较

插入排序,希尔排序,选择排序,归并排序,冒泡排序,快速排序,堆排序[1][2]

插入排序

  1. /**
  2. * 插入排序
  3. * 基本思想:寻找到可以插入的位置
  4. */
  5. vector<int> InsertSort(vector<int> result){
  6. int tmp = 0;
  7. for(int i=1; i<result.size(); i++){
  8. int j= i-1;
  9. tmp = result[i];
  10. while(j >= 0 && tmp < result[j]){
  11. result[j+1]= result[j];
  12. j--;
  13. }
  14. result[j+1] = tmp;
  15. }
  16. return result;
  17. }

希尔排序

  1. /**
  2. * 希尔排序
  3. * 基本思想:
  4. * 算法先将要排序的一组数按某个增量d(n/2,n为要排序数的个数)分成若干组,
  5. * 每组中记录的下标相差d.对每组中全部元素进行直接插入排序,
  6. * 然后再用一个较小的增量(d/2)对它进行分组,在每组中再进行直接插入排序。
  7. * 当增量减到1时,进行直接插入排序后,排序完成。
  8. */
  9. vector<int> ShellSort(vector<int> result){
  10. int tmp = 0;
  11. double d1 = result.size();
  12. while(true){
  13. d1 = ceil(d1/2);
  14. int d = (int)d1;
  15. for(int i=0; i<d; i++){
  16. //增量为d的插入排序
  17. for(int j=i+d; j<result.size(); j+=d){
  18. int k = j - d;
  19. tmp = result[j];
  20. while(k >= 0 && result[k] > tmp){
  21. result[k+d] = result[k];
  22. k = k - d;
  23. }
  24. result[k+d] = tmp;
  25. }
  26. }
  27. if(d == 1)
  28. break;
  29. }
  30. return result;
  31. }

选择排序

  1. /**
  2. * 选择排序:
  3. * 基本思想:
  4. * 在要排序的一组数中,选出最小的一个数与第一个位置的数交换;
  5. * 然后在剩下的数当中再找最小的与第二个位置的数交换,如此循环到倒数第二个数和最后一个数比较为止。
  6. */
  7. vector<int> SelectSort(vector<int> result){
  8. for(int i=0; i<result.size()-1; i++){
  9. int k = i;
  10. for(int j=i+1; j<result.size(); j++){
  11. if(result[k] > result[j] )
  12. k = j;
  13. }
  14. if( k != i){
  15. int tmp = result[k];
  16. result[k] = result[i];
  17. result[i] = tmp;
  18. }
  19. }
  20. return result;
  21. }

堆排序

  1. //*************************************************
  2. //堆排序
  3. /**
  4. * 重新构建堆,使之符合堆的规则
  5. */
  6. void __fixdwon(vector<int>& arr,int root, int lastIndex){
  7. int i = root;
  8. int tmp = arr[root];
  9. int j = 2*i + 1;
  10. while(j < lastIndex){
  11. if(j + 1 < lastIndex && arr[j+1] > arr[j])
  12. j++;
  13. //找到比根节点小的值
  14. if(arr[j] <= tmp)
  15. break;
  16. //移动到父节点
  17. arr[i] = arr[j];
  18. i = j;
  19. j = 2*i + 1;
  20. }
  21. arr[i] = tmp;
  22. }
  23. //建堆
  24. void __buildMaxHeap(vector<int>& arr, int lastindex){
  25. for(int i=lastindex/2-1; i>=0; i--){
  26. this->__fixdwon(arr, i, lastindex);
  27. }
  28. }
  29. /**
  30. * 堆排序
  31. *
  32. */
  33. vector<int> HeapSort(vector<int> arr){
  34. this->__buildMaxHeap(arr, arr.size());
  35. for(int i=arr.size()-1; i>=0; i--){
  36. int tmp = arr[0];
  37. arr[0] = arr[i];
  38. arr[i] = tmp;
  39. this->__fixdwon(arr, 0, i);
  40. }
  41. return arr;
  42. }

冒泡排序

  1. /**
  2. * 冒泡排序
  3. * 相邻比较
  4. */
  5. vector<int> BubbleSort(vector<int> arr){
  6. for(int i=0; i<arr.size(); i++){
  7. for(int j=1; j<arr.size()-i; j++){
  8. if(arr[j] < arr[j-1]){
  9. int tmp = arr[j];
  10. arr[j] = arr[j-1];
  11. arr[j-1] = tmp;
  12. }
  13. }
  14. }
  15. return arr;
  16. }

冒泡排序优化

  1. /**
  2. * 冒泡排序算法的优化1
  3. *
  4. * 设置一个标志flag,当某一趟完全没有进行交换,就不需要进行下一轮的排序
  5. */
  6. vector<int> BubbleSort1(vector<int> arr){
  7. bool flag = true;
  8. int k = arr.size();
  9. while(flag && k >0 ) {
  10. flag = false;
  11. for (int i = 1; i < k; i++) {
  12. if (arr[i] < arr[i - 1]) {
  13. swap(arr[i], arr[i - 1]);
  14. flag = true;
  15. }
  16. }
  17. k--;
  18. }
  19. return arr;
  20. }

快速排序

  1. /**
  2. * 快速排序
  3. */
  4. /**
  5. * 切分函数,以第一个作为枢纽
  6. */
  7. int __partition(vector<int>& arr, int first, int last){
  8. int key = arr[first];
  9. while(first < last){
  10. while(first < last && arr[last] >= key){
  11. last--;
  12. }
  13. arr[first] = arr[last];
  14. while(first < last && arr[first] <= key){
  15. first++;
  16. }
  17. arr[last] = arr[first];
  18. }
  19. arr[first] = key;
  20. return first;
  21. }
  22. /**
  23. * 递归排序
  24. */
  25. void __quickSort(vector<int>& arr, int start, int end){
  26. if(start < end){
  27. int middle = this->__partition(arr, start, end);
  28. __quickSort(arr, start, middle-1);
  29. __quickSort(arr, middle+1, end);
  30. }
  31. }
  32. vector<int> QuickSort(vector<int> arr){
  33. __quickSort(arr,0, arr.size()-1);
  34. return arr;
  35. }

归并排序

  1. /////////////////////////////////////////////////////////////////////
  2. /**
  3. * 归并排序
  4. */
  5. void __merge(vector<int>&arr, int start, int mid, int end){
  6. vector<int> tmp;
  7. int left = start;
  8. int right = mid + 1;
  9. while(left <= mid && right <= end){
  10. if(arr[left] < arr[right])
  11. tmp.push_back(arr[left++]);
  12. else
  13. tmp.push_back(arr[right++]);
  14. }
  15. while(left <= mid){
  16. tmp.push_back(arr[left++]);
  17. }
  18. while(right <= end){
  19. tmp.push_back(arr[right++]);
  20. }
  21. for(int i=start; i<=end; i++){
  22. arr[i] = tmp[i-start];
  23. }
  24. }
  25. void __sort(vector<int>& arr, int start, int end){
  26. if(start < end){
  27. int mid = (start + end)/2;
  28. __sort(arr, start, mid);
  29. __sort(arr, mid+1, end);
  30. __merge(arr, start, mid, end);
  31. }
  32. }
  33. vector<int> MergeSort(vector<int> arr){
  34. __sort(arr, 0, arr.size()-1);
  35. return arr;
  36. }

程序中有些地方写了this,是因为原始代码是写在一个类中,具体可以查看我的Github参考代码实现,其中还有效率比较代码。

效率比较

时间性能比较(毫秒)

数组大小 10000 100000 1000000
InsertSort 210 20727 2038491
ShellSort 3 46 747
SelectSort 372 37885 3742262
HeapSort 0 31 449
QuickSort 15 15 265
BubbleSort 854 80354 7977907
MergeSort 15 141 1435
Sort(c++内置排序) 0 31 265

可以看到随着待排序数组的增大,快速排序等算法的优势就越明显。

参考博客:

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注