Chinaunix首页 | 论坛 | 博客
  • 博客访问: 36571
  • 博文数量: 7
  • 博客积分: 172
  • 博客等级: 入伍新兵
  • 技术积分: 95
  • 用 户 组: 普通用户
  • 注册时间: 2011-03-10 22:50
文章分类

全部博文(7)

文章存档

2012年(7)

我的朋友

分类: Python/Ruby

2012-02-19 18:13:26

插入排序
插入排序算法比较简单的排序了。基本思想就是存在一有序数列,然后将数插入到有序数列中去。跟扑克码牌的过程基本一样。
C:
  1. #include <stdio.h>
  2. void display(int nums[], int len);
  3. void insert_sort(int nums[], int len);

  4. int main(int argc, char* argv)
  5. {
  6.     int nums[4] = {2,53,12,3};
  7.     insert_sort(nums, 4);
  8.     display(nums, 4);    
  9.     return 0;
  10. }

  11. void display(int nums[], int len)
  12. {
  13.     int i = 0;
  14.     for (i=0; i<len; i++)
  15.     {
  16.         printf("%d ", nums[i]);
  17.     }
  18. }

  19. void insert_sort(int nums[], int len)
  20. {
  21.     int i = 0;
  22.     int j = 0;
  23.     int key = 0;

  24.     for (i=1; i<len; i++)
  25.     {
  26.         key = nums[i];
  27.         j = i - 1;
  28.         while (j >= 0 && key < nums[j])
  29.         {
  30.             nums[j + 1] = nums[j];
  31.             j--;
  32.         }
  33.         nums[j + 1] = key;
  34.     }
  35. }
python:
  1. #!/usr/bin/python
  2. def insert_sort(nums):
  3.     for i in range(1, len(nums)):
  4.         key = nums[i]
  5.         j = i - 1
  6.         while j >= 0 and nums[j] > key:
  7.             nums[j + 1] = nums[j]
  8.             j = j - 1
  9.         nums[j + 1] = key
  10.     return nums

  11. if __name__ == '__main__':
  12.     nums = [2, 4, 1,33,11]
  13.     print nums
  14.     print insert_sort(nums)
合并排序
合并排序也称归并排序。是分治法的典型应用。分治思想是将每个问题分解成个个小问题。将每个小问题解决。然后合并。
具体的合并排序就是,将一组无序数按n/2递归分解成只有一个元素的子项。一个元素就是已经排好序的了。然后将这些有序的子元素进行合并。
C:
  1. #include <stdio.h>
  2. #include <malloc.h>

  3. #define MAX (1 << 30)
  4. void display(int nums[], int len);
  5. void merge(int nums[], int first, int middle, int last);
  6. void merge_sort(int nums[], int first, int last);

  7. int main(int argc, char* argv[])
  8. {
  9.     int nums[] = {21,33,4,24,23,54,2};
  10.     merge_sort(nums, 0, 6);
  11.     display(nums, 7);
  12.     return 0;
  13. }

  14. void merge_sort(int nums[], int first, int last)
  15. {
  16.     int middle = 0;
  17.     if (first < last)
  18.     {
  19.         middle = (first + last) / 2;    
  20.         merge_sort(nums, first, middle);
  21.         merge_sort(nums, middle + 1, last);
  22.         merge(nums, first, middle, last);
  23.     }
  24. }

  25. void merge(int nums[], int first, int middle, int last)
  26. {
  27.     int n1 = middle - first + 1;
  28.     int n2 = last - middle;
  29.     int *lnums = (int*)malloc(sizeof(nums[0]) * (n1+1));
  30.     int *rnums = (int*)malloc(sizeof(nums[0]) * (n2+1));
  31.     int i = 0;
  32.     int p,q;

  33.     //左数组赋值
  34.     for (i=0; i<n1; i++)
  35.     {
  36.         lnums[i] = nums[first+i];
  37.     }
  38.     lnums[i] = MAX;

  39.     //右数组赋值
  40.     for (i=0; i<n2; i++)
  41.     {
  42.         rnums[i] = nums[i+middle+1];
  43.     }
  44.     rnums[i] = MAX;

  45.     //合并
  46.     p = q = 0;    
  47.     for (i=first; i<=last; i++)
  48.     {
  49.         if (lnums[p] < rnums[q])
  50.         {
  51.             nums[i] = lnums[p];
  52.             p++;
  53.         }
  54.         else
  55.         {
  56.             nums[i] = rnums[q];
  57.             q++;
  58.         }
  59.     }
  60.     free(lnums);
  61.     free(rnums);
  62. }
千万注意合并排序中的边界问题,很容易出错。在这种解法中合并步骤中的循环是从first到last+1所以这是<=last,因为main函数中merge_sort函数中传递的是下标,不是元素个数。
python:
  1. #!/usr/bin/python
  2. import sys

  3. def merge(nums, first, middle, last):

  4.     n1 = middle - first + 1
  5.     n2 = last - middle
  6.     lnums = nums[first:middle+1]
  7.     rnums = nums[middle+1:last+1]
  8.     lnums.append(sys.maxint)
  9.     rnums.append(sys.maxint)
  10.     p = q = 0
  11.     for i in range(first, last+1):
  12.         if lnums[p] < rnums[q]:
  13.             nums[i] = lnums[p]
  14.             p += 1
  15.         else:
  16.             nums[i] = rnums[q]
  17.             q += 1
  18.     print nums

  19. def merge_sort(nums, first, last):
  20.     middle = 0
  21.     if first < last:
  22.         middle = (first + last) / 2
  23.         merge_sort(nums, first, middle)
  24.         merge_sort(nums, middle+1, last)
  25.         merge(nums, first, middle, last)

  26. if __name__ == '__main__':
  27.     nums = [21, 33, 4, 24, 23, 54, 2]
  28.     print nums
  29.     print merge_sort(nums, 0, 6)
  30.     print nums
python 中代码应注意在merge()函数中的切片边界。一定注意是左闭右开并且是了0为开始。

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

liurhyme2012-02-20 11:08:48

赞一个