所谓有鬼 其实是人们心中有个鬼

让我帮你画个符吧

数据结构 排序3 交换排序

原创  数据结构 排序3 交换排序 收藏

选择排序:

a.选择排序( select sort ):选择排序和冒泡排序地位差不多,比较初级的排序方法。

使用情况少。

详细请看源代码:

 

  1. #include <stdio.h>  
  2. #include <stdlib.h>  
  3.   
  4. #define NUM 51  
  5.   
  6. int SelectSort( int a[], int n )  
  7. {  
  8.     int i, j, k, t;  
  9.   
  10.     for( i = 0; i < n-1; i++ )  
  11.     {  
  12.         t = i;  
  13.         for( j = i+1; j < n; j++ )  
  14.         {  
  15.             if( a[j] < a[t] ) //选出这当中最小的数  
  16.                 t = j;  
  17.         }  
  18.         k = a[i];  //把选出的最小值与预先设定的位置交换。  
  19.         a[i] = a[t];  
  20.         a[t] = k;  
  21.     }  
  22.     return 1;  
  23. }  
  24.   
  25. int main( void )  
  26. {  
  27.     //int a[NUM] = { 3, 4, 2, 5, 1 };  
  28.     int i;  
  29.       
  30.     int a[NUM];  
  31.   
  32.     for( i = 0; i < NUM; i++ )  
  33.     {  
  34.         a[i] = rand() % NUM;  
  35.     }  
  36.   
  37.     //选择排序  
  38.     SelectSort( a, NUM );  
  39.     for( i = 0; i < NUM; i++ )  
  40.     {  
  41.         printf( "%d \n", a[i] );  
  42.     }  
  43.     return 0;  
  44. }  

b.堆排序( heap sort ):堆排序适合于数据量非常大的场合(百万数据)。堆排序不需要大量的递归或者多维的暂存数组。这对于数据量非常巨大的序列是合适的。比如超过数百万条记录,因为快速排序,归并排序都使用递归来设计算法,在数据量非常大的时候,可能会发生堆栈溢出错误。

说下堆排序算法,刚开始看了很大天才弄明白是怎么会是,严重BS下自己!呵呵,(^_^

“不要对我笑,正说你呢!傻瓜!”这是经常用来对付女朋友傻笑的台词,不过久了就不管用了,没什么杀伤力。(^_^...........

下面用visio画的一个示意图,按自己理解没照搬网上的,不是专业水平,所以只能聊以自慰。当然能做出诸如DSDEMO.EXE动画加对应代码,让人一目了然的好东东呢,哥哥我也非常佩服他了。

声明:树顶030代表树顶端序号,3代表对应的值,其他同理可得。

 

详细请看源代码:

  1. #include <stdio.h>  
  2. #include <stdlib.h>  
  3.   
  4. #define NUM 51  
  5.   
  6. int chbSwap( int &a, int &b )  
  7. {  
  8.     if( a != b )  
  9.     {  
  10.         a ^= b;  
  11.         b ^= a;  
  12.         a ^= b;  
  13.     }  
  14.     return 1;  
  15. }  
  16.   
  17. int adjust( int a[], int beg, int end )  
  18. {  
  19.     int i,j,t;  
  20.       
  21.     t = a[beg];  
  22.     i = beg;  
  23.     j = 2*i + 1;  
  24.   
  25.     while( j < end )  
  26.     {  
  27.         if( j < end - 1 )  
  28.         {  
  29.             if( a[j] > a[j+1] )  //找出两者当中最小的  
  30.                 j++;  
  31.         }  
  32.         if( t < a[j] )  //找出父子和两个孩子中最小的放在父亲位置  
  33.             break;  
  34.         a[ (j-1) / 2 ] = a[j];   
  35.         j = 2*j+1;  //如果孩子下面还有孩子继续做比较  
  36.     }  
  37.     a[ (j-1)/2 ] = t;  
  38.     return 1;  
  39. }  
  40.   
  41. int HeapSort( int a[], int n )  
  42. {  
  43.     int i;  
  44.       
  45.     //第一轮按完全二叉树找出这当中最小的值  
  46.     //并构成一个完全二叉树,父亲和两个孩子中最小的  
  47.     //值放在父亲位置  
  48.     for( i = n / 2 - 1; i >=0; i-- )   
  49.     {  
  50.         adjust( a, i, n );  
  51.     }  
  52.   
  53.     //第二轮根据前轮找出的最小值,  
  54.     //交换到最结尾,暂时就不再将它纳入二叉树  
  55.     //继续从剩余的二叉树中找出最小的值  
  56.     //因为前面已经排过二叉数,有一定逻辑顺序  
  57.     //因此这次搜寻最小值次数会比第一次明显少很多。  
  58.     //这也是堆排序的高明之处!!!  
  59.     for( i = n - 1; i > 0; i-- )  
  60.     {  
  61.         chbSwap( a[0], a[i] );  
  62.         adjust( a, 0, i );  
  63.     }  
  64.     return 1;  
  65. }  
  66.   
  67. int main( void )  
  68. {  
  69. //  int a[NUM] = { 3, 4, 2, 5, 1 };  
  70.     int i;  
  71.       
  72.     int a[NUM];  
  73.   
  74.     for( i = 0; i < NUM; i++ )  
  75.     {  
  76.         a[i] = rand() % NUM;  
  77.     }  
  78.       
  79.   
  80.     //堆排序  
  81.     HeapSort( a, NUM );  
  82.     for( i = 0; i < NUM; i++ )  
  83.     {  
  84.         printf( "%d \n", a[i] );  
  85.     }  
  86.     return 0;  

原创  数据结构 排序3 交换排序 收藏

选择排序:

a.选择排序( select sort ):选择排序和冒泡排序地位差不多,比较初级的排序方法。

使用情况少。

详细请看源代码:

 

  1. #include <stdio.h>  
  2. #include <stdlib.h>  
  3.   
  4. #define NUM 51  
  5.   
  6. int SelectSort( int a[], int n )  
  7. {  
  8.     int i, j, k, t;  
  9.   
  10.     for( i = 0; i < n-1; i++ )  
  11.     {  
  12.         t = i;  
  13.         for( j = i+1; j < n; j++ )  
  14.         {  
  15.             if( a[j] < a[t] ) //选出这当中最小的数  
  16.                 t = j;  
  17.         }  
  18.         k = a[i];  //把选出的最小值与预先设定的位置交换。  
  19.         a[i] = a[t];  
  20.         a[t] = k;  
  21.     }  
  22.     return 1;  
  23. }  
  24.   
  25. int main( void )  
  26. {  
  27.     //int a[NUM] = { 3, 4, 2, 5, 1 };  
  28.     int i;  
  29.       
  30.     int a[NUM];  
  31.   
  32.     for( i = 0; i < NUM; i++ )  
  33.     {  
  34.         a[i] = rand() % NUM;  
  35.     }  
  36.   
  37.     //选择排序  
  38.     SelectSort( a, NUM );  
  39.     for( i = 0; i < NUM; i++ )  
  40.     {  
  41.         printf( "%d \n", a[i] );  
  42.     }  
  43.     return 0;  
  44. }  

b.堆排序( heap sort ):堆排序适合于数据量非常大的场合(百万数据)。堆排序不需要大量的递归或者多维的暂存数组。这对于数据量非常巨大的序列是合适的。比如超过数百万条记录,因为快速排序,归并排序都使用递归来设计算法,在数据量非常大的时候,可能会发生堆栈溢出错误。

说下堆排序算法,刚开始看了很大天才弄明白是怎么会是,严重BS下自己!呵呵,(^_^

“不要对我笑,正说你呢!傻瓜!”这是经常用来对付女朋友傻笑的台词,不过久了就不管用了,没什么杀伤力。(^_^...........

下面用visio画的一个示意图,按自己理解没照搬网上的,不是专业水平,所以只能聊以自慰。当然能做出诸如DSDEMO.EXE动画加对应代码,让人一目了然的好东东呢,哥哥我也非常佩服他了。

声明:树顶030代表树顶端序号,3代表对应的值,其他同理可得。

 

详细请看源代码:

  1. #include <stdio.h>  
  2. #include <stdlib.h>  
  3.   
  4. #define NUM 51  
  5.   
  6. int chbSwap( int &a, int &b )  
  7. {  
  8.     if( a != b )  
  9.     {  
  10.         a ^= b;  
  11.         b ^= a;  
  12.         a ^= b;  
  13.     }  
  14.     return 1;  
  15. }  
  16.   
  17. int adjust( int a[], int beg, int end )  
  18. {  
  19.     int i,j,t;  
  20.       
  21.     t = a[beg];  
  22.     i = beg;  
  23.     j = 2*i + 1;  
  24.   
  25.     while( j < end )  
  26.     {  
  27.         if( j < end - 1 )  
  28.         {  
  29.             if( a[j] > a[j+1] )  //找出两者当中最小的  
  30.                 j++;  
  31.         }  
  32.         if( t < a[j] )  //找出父子和两个孩子中最小的放在父亲位置  
  33.             break;  
  34.         a[ (j-1) / 2 ] = a[j];   
  35.         j = 2*j+1;  //如果孩子下面还有孩子继续做比较  
  36.     }  
  37.     a[ (j-1)/2 ] = t;  
  38.     return 1;  
  39. }  
  40.   
  41. int HeapSort( int a[], int n )  
  42. {  
  43.     int i;  
  44.       
  45.     //第一轮按完全二叉树找出这当中最小的值  
  46.     //并构成一个完全二叉树,父亲和两个孩子中最小的  
  47.     //值放在父亲位置  
  48.     for( i = n / 2 - 1; i >=0; i-- )   
  49.     {  
  50.         adjust( a, i, n );  
  51.     }  
  52.   
  53.     //第二轮根据前轮找出的最小值,  
  54.     //交换到最结尾,暂时就不再将它纳入二叉树  
  55.     //继续从剩余的二叉树中找出最小的值  
  56.     //因为前面已经排过二叉数,有一定逻辑顺序  
  57.     //因此这次搜寻最小值次数会比第一次明显少很多。  
  58.     //这也是堆排序的高明之处!!!  
  59.     for( i = n - 1; i > 0; i-- )  
  60.     {  
  61.         chbSwap( a[0], a[i] );  
  62.         adjust( a, 0, i );  
  63.     }  
  64.     return 1;  
  65. }  
  66.   
  67. int main( void )  
  68. {  
  69. //  int a[NUM] = { 3, 4, 2, 5, 1 };  
  70.     int i;  
  71.       
  72.     int a[NUM];  
  73.   
  74.     for( i = 0; i < NUM; i++ )  
  75.     {  
  76.         a[i] = rand() % NUM;  
  77.     }  
  78.       
  79.   
  80.     //堆排序  
  81.     HeapSort( a, NUM );  
  82.     for( i = 0; i < NUM; i++ )  
  83.     {  
  84.         printf( "%d \n", a[i] );  
  85.     }  
  86.     return 0;  

posted on 2010-08-16 15:02  鬼话符  阅读(176)  评论(0)    收藏  举报

导航