各种排序算法的实现

来源:互联网 发布:c语言三元表达式 编辑:程序博客网 时间:2024/04/24 00:38
  1. //各种排序算法的实现
  2. /*
  3. 交换函数
  4. */
  5. void swap(int *list, int low, int high )
  6. {    
  7.     int temp = list[low];
  8.     list[low] = list[high];
  9.     list[high] = temp;
  10. }

  11. /*
  12. 小于函数
  13. */
  14. bool lt(const int low, const int high )
  15. {
  16.     if(low < high)
  17.         return true;
  18.     else 
  19.         return false;
  20. }

  21. /*
  22. 插入排序(稳定)
  23. 原理:插入排序逐个处理待排序的记录。每个新记录与前面已排序的子序列进行比较,
  24. 将它插入到子序列中正确的位置
  25. 代价是n2
  26. */
  27. void inssort( int *list, int n )
  28. {
  29.     int i,j;
  30.     for( i = 1; i < n; i++ )
  31.     {
  32.         for( j = i; ( j > 0 ) && ( lt( list[j], list[j-1] ) ); j-- )
  33.             swap( list, j, j-);
  34.     }
  35. }

  36. /*
  37. 冒泡排序(稳定)
  38. 原理:第一次的内部for循环从记录数组的底部比较到顶部,比较相邻的值。
  39. 如果低序号的值比高序号的值大,则二者交换顺序
  40. 代价是n2
  41. */
  42. void bubsort( int *list, int n )
  43. {
  44.     int i,j;
  45.     for ( i = 0; i < n-1; i++ )
  46.     {
  47.         for ( j = n-1; j > i; j-- )
  48.         {    
  49.             if( lt( list[j], list[j-1] ) )
  50.                 swap( list, j, j-);
  51.         }
  52.     }
  53. }

  54. /*
  55. 选择排序(不稳定)
  56. 原理:选择排序的第i次是“选择”数组中第i小的记录,并将该记录放到数组的第i个位置。
  57. 即首先从未排序的序列中找到最小的值,接着找到次小的,依次类推
  58. 代价是n2
  59. */
  60. void selsort( int *list, int n )
  61. {
  62.     int i,j;
  63.     for ( i = 0; i < n-1; i++ )
  64.     {
  65.         int low_index = i;
  66.         for ( j = n-1; j > i; j-- )
  67.         {    
  68.             if( lt( list[j], list[low_index] ) )
  69.                 low_index = j;
  70.         }
  71.         swap( list, i, low_index );
  72.     }
  73. }

  74. /*
  75. 插入排序函数(shell排序的辅助函数)
  76. */
  77. void inssort( int *list, int n, int incr )
  78. {
  79.     int i,j;
  80.     for ( i = incr; i < n; i += incr )
  81.     {
  82.         for ( j = i; (>= incr) && (lt (list[j],list[j-incr]) ); j -= incr )
  83.         {    
  84.             swap( list, j, j-incr );
  85.         }        
  86.     }
  87. }

  88. /*
  89. shell排序(不稳定)
  90. 原理:将序列分成子序列,然后分别对子序列用插入排序的方法进行排序,最后将子序列组合起来。
  91. 代价是n1.5
  92. */
  93. void shellsort( int *list, int n )
  94. {
  95.     int i,j;
  96.     for ( i = n/2; i > 2; i /= 2 )
  97.     {
  98.         for ( j = 0; j < i; j++ )
  99.         {    
  100.             inssort(&list[j], n-j, i);
  101.         }
  102.     }
  103.     inssort(list, n, 1);
  104. }

  105. /*
  106. 快速排序(不稳定)
  107. 原理:首先选择一个轴值,小于轴值的结点被放到轴值的左边,大于轴值的结点被放到轴值的右边,这样轴值就被放在了正确的位置上。
  108. 然后对轴值左边和右边的子序列进行类似操作。
  109. 第一次调用的形式为quicksort(list,0,n-1)
  110. 代价是n*logn
  111. */
  112. void quicksort(int *list, int low, int high)
  113. {
  114.     int pivot = list[ (low + high) / 2 ];
  115.     int left = low - 1;
  116.     int right = high;
  117.     
  118.     if(low >= high) 
  119.         return 0;
  120.     
  121.     swap(list, (low + high) / 2, high);          
  122.     do     
  123.     {
  124.         while(list[++left] < pivot);         
  125.         while(right != 0 && list[--right] > pivot);         
  126.         swap(list, left, right);     
  127.     } while (left < right);          
  128.     
  129.     swap(list, left, right);     
  130.     swap(list, left, high);          
  131.     
  132.     quicksort(list, low, left - 1);     
  133.     quicksort(list, left + 1, high); 
  134. }
0 0
原创粉丝点击