Chinaunix首页 | 论坛 | 博客
  • 博客访问: 789725
  • 博文数量: 296
  • 博客积分: 5376
  • 博客等级: 大校
  • 技术积分: 2298
  • 用 户 组: 普通用户
  • 注册时间: 2009-03-14 19:02
文章分类

全部博文(296)

文章存档

2023年(2)

2020年(2)

2018年(2)

2017年(26)

2016年(4)

2015年(19)

2014年(12)

2013年(26)

2012年(84)

2011年(50)

2010年(41)

2009年(28)

分类:

2012-10-22 09:26:40

原文地址:归并和快速排序算法 作者:ccx_wz

归并排序,它采取分而治之(Divide-and-Conquer)的策略,时间复杂度最差、平均、最好都是Θ(nlgn),
空间复杂度是Θ(n),归并排序的步骤如下:
1. Divide: 把长度为n的输入序列分成两个长度为n/2的子序列。
2. Conquer: 对这两个子序列分别采用归并排序。
3. Combine: 将两个排序好的子序列合并成一个最终的排序序列。
在描述归并排序的步骤时又调用了归并排序本身,可见这是一个递归的过程。

点击(此处)折叠或打开

  1. #define N 100000
  2. int tmp[N];
  3. void my_merge(int a[], int left_start, int left_end, int right_start, int right_end)
  4. {
  5.     int left_index = left_start, right_index = right_start,tmp_index = 0;
  6.     while(left_index<=left_end && right_index<=right_end)
  7.     {
  8.         if(a[left_index]<a[right_index])
  9.             tmp[tmp_index++] = a[left_index++];
  10.         else //right data goto array    
  11.             tmp[tmp_index++] = a[right_index++];
  12.     }
  13.     while(left_index<=left_end)
  14.         tmp[tmp_index++] = a[left_index++];
  15.     while(right_index<=right_end)
  16.         tmp[tmp_index++] = a[right_index++];
  17.     int i = 0;
  18.     for(i = 0; i < tmp_index; i++)
  19.     {
  20.         a[left_start+i] = tmp[i];
  21.     }
  22. }
  23. //7,0,9,4, 8,5,3,1
  24. void merge_sort(int a[], int start, int end)
  25. {
  26.     if(start>=end) return;
  27.     int mid = (start+end)/2;
  28.     merge_sort(a, start, mid);
  29.     merge_sort(a, mid+1, end);
  30.     my_merge(a, start, mid, mid+1, end);
  31. }


快速排序是另外一种采用分而治之策略的排序算法,在平均情况下的时间复杂度也是Θ(nlgn),最坏情况下时间复杂度是Θ(n2),空间复杂度是Θ(lgn),但比归并排序有更小的时间常数。其基本思想:通过一趟扫描,就能确保某个数(以它为基准点吧)的左边各数都比它小,右边各数都比它大。然后又用同样的方法处理它左右两边的数,直到基准点的左右只有一个元素为止。

点击(此处)折叠或打开

  1. int small[N];
  2. int big[N];
  3. void quick_sort(int a[], int start, int end)
  4. {
  5.     if(start >= end) return;
  6.     int pivot = a[start], small_index = 0, big_index = 0;
  7.     int i = 0;
  8.     //divide
  9.     for(i = start+1; i <= end; i++)
  10.     {
  11.         if(a[i] < pivot)
  12.             small[small_index++] = a[i];
  13.         else big[big_index++] = a[i];
  14.     }
  15.     //copy
  16.     for(i = 0; i < small_index; i++)
  17.         a[i+start] = small[i];
  18.     int mid = start+small_index;
  19.     a[mid] = pivot;
  20.     for(i = 0; i < big_index; i++)
  21.         a[i+start+small_index+1] = big[i];
  22.     //recursive
  23.     quick_sort(a, start, mid);
  24.     quick_sort(a, mid+1, end);
  25. }


 

阅读(793) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~