数据结构 排序3 交换排序
数据结构 排序3 交换排序 收藏
选择排序:
a.选择排序( select sort ):选择排序和冒泡排序地位差不多,比较初级的排序方法。
使用情况少。
详细请看源代码:
- #include <stdio.h>
- #include <stdlib.h>
- #define NUM 51
- int SelectSort( int a[], int n )
- {
- int i, j, k, t;
- for( i = 0; i < n-1; i++ )
- {
- t = i;
- for( j = i+1; j < n; j++ )
- {
- if( a[j] < a[t] ) //选出这当中最小的数
- t = j;
- }
- k = a[i]; //把选出的最小值与预先设定的位置交换。
- a[i] = a[t];
- a[t] = k;
- }
- return 1;
- }
- int main( void )
- {
- //int a[NUM] = { 3, 4, 2, 5, 1 };
- int i;
- int a[NUM];
- for( i = 0; i < NUM; i++ )
- {
- a[i] = rand() % NUM;
- }
- //选择排序
- SelectSort( a, NUM );
- for( i = 0; i < NUM; i++ )
- {
- printf( "%d \n", a[i] );
- }
- return 0;
- }
b.堆排序( heap sort ):堆排序适合于数据量非常大的场合(百万数据)。堆排序不需要大量的递归或者多维的暂存数组。这对于数据量非常巨大的序列是合适的。比如超过数百万条记录,因为快速排序,归并排序都使用递归来设计算法,在数据量非常大的时候,可能会发生堆栈溢出错误。
说下堆排序算法,刚开始看了很大天才弄明白是怎么会是,严重BS下自己!呵呵,(^_^)
“不要对我笑,正说你呢!傻瓜!”这是经常用来对付女朋友傻笑的台词,不过久了就不管用了,没什么杀伤力。(^_^)...........
下面用visio画的一个示意图,按自己理解没照搬网上的,不是专业水平,所以只能聊以自慰。当然能做出诸如DSDEMO.EXE动画加对应代码,让人一目了然的好东东呢,哥哥我也非常佩服他了。
声明:树顶0:3中0代表树顶端序号,3代表对应的值,其他同理可得。
详细请看源代码:
- #include <stdio.h>
- #include <stdlib.h>
- #define NUM 51
- int chbSwap( int &a, int &b )
- {
- if( a != b )
- {
- a ^= b;
- b ^= a;
- a ^= b;
- }
- return 1;
- }
- int adjust( int a[], int beg, int end )
- {
- int i,j,t;
- t = a[beg];
- i = beg;
- j = 2*i + 1;
- while( j < end )
- {
- if( j < end - 1 )
- {
- if( a[j] > a[j+1] ) //找出两者当中最小的
- j++;
- }
- if( t < a[j] ) //找出父子和两个孩子中最小的放在父亲位置
- break;
- a[ (j-1) / 2 ] = a[j];
- j = 2*j+1; //如果孩子下面还有孩子继续做比较
- }
- a[ (j-1)/2 ] = t;
- return 1;
- }
- int HeapSort( int a[], int n )
- {
- int i;
- //第一轮按完全二叉树找出这当中最小的值
- //并构成一个完全二叉树,父亲和两个孩子中最小的
- //值放在父亲位置
- for( i = n / 2 - 1; i >=0; i-- )
- {
- adjust( a, i, n );
- }
- //第二轮根据前轮找出的最小值,
- //交换到最结尾,暂时就不再将它纳入二叉树
- //继续从剩余的二叉树中找出最小的值
- //因为前面已经排过二叉数,有一定逻辑顺序
- //因此这次搜寻最小值次数会比第一次明显少很多。
- //这也是堆排序的高明之处!!!
- for( i = n - 1; i > 0; i-- )
- {
- chbSwap( a[0], a[i] );
- adjust( a, 0, i );
- }
- return 1;
- }
- int main( void )
- {
- // int a[NUM] = { 3, 4, 2, 5, 1 };
- int i;
- int a[NUM];
- for( i = 0; i < NUM; i++ )
- {
- a[i] = rand() % NUM;
- }
- //堆排序
- HeapSort( a, NUM );
- for( i = 0; i < NUM; i++ )
- {
- printf( "%d \n", a[i] );
- }
- return 0;
- }
数据结构 排序3 交换排序 收藏
选择排序:
a.选择排序( select sort ):选择排序和冒泡排序地位差不多,比较初级的排序方法。
使用情况少。
详细请看源代码:
- #include <stdio.h>
- #include <stdlib.h>
- #define NUM 51
- int SelectSort( int a[], int n )
- {
- int i, j, k, t;
- for( i = 0; i < n-1; i++ )
- {
- t = i;
- for( j = i+1; j < n; j++ )
- {
- if( a[j] < a[t] ) //选出这当中最小的数
- t = j;
- }
- k = a[i]; //把选出的最小值与预先设定的位置交换。
- a[i] = a[t];
- a[t] = k;
- }
- return 1;
- }
- int main( void )
- {
- //int a[NUM] = { 3, 4, 2, 5, 1 };
- int i;
- int a[NUM];
- for( i = 0; i < NUM; i++ )
- {
- a[i] = rand() % NUM;
- }
- //选择排序
- SelectSort( a, NUM );
- for( i = 0; i < NUM; i++ )
- {
- printf( "%d \n", a[i] );
- }
- return 0;
- }
b.堆排序( heap sort ):堆排序适合于数据量非常大的场合(百万数据)。堆排序不需要大量的递归或者多维的暂存数组。这对于数据量非常巨大的序列是合适的。比如超过数百万条记录,因为快速排序,归并排序都使用递归来设计算法,在数据量非常大的时候,可能会发生堆栈溢出错误。
说下堆排序算法,刚开始看了很大天才弄明白是怎么会是,严重BS下自己!呵呵,(^_^)
“不要对我笑,正说你呢!傻瓜!”这是经常用来对付女朋友傻笑的台词,不过久了就不管用了,没什么杀伤力。(^_^)...........
下面用visio画的一个示意图,按自己理解没照搬网上的,不是专业水平,所以只能聊以自慰。当然能做出诸如DSDEMO.EXE动画加对应代码,让人一目了然的好东东呢,哥哥我也非常佩服他了。
声明:树顶0:3中0代表树顶端序号,3代表对应的值,其他同理可得。
详细请看源代码:
- #include <stdio.h>
- #include <stdlib.h>
- #define NUM 51
- int chbSwap( int &a, int &b )
- {
- if( a != b )
- {
- a ^= b;
- b ^= a;
- a ^= b;
- }
- return 1;
- }
- int adjust( int a[], int beg, int end )
- {
- int i,j,t;
- t = a[beg];
- i = beg;
- j = 2*i + 1;
- while( j < end )
- {
- if( j < end - 1 )
- {
- if( a[j] > a[j+1] ) //找出两者当中最小的
- j++;
- }
- if( t < a[j] ) //找出父子和两个孩子中最小的放在父亲位置
- break;
- a[ (j-1) / 2 ] = a[j];
- j = 2*j+1; //如果孩子下面还有孩子继续做比较
- }
- a[ (j-1)/2 ] = t;
- return 1;
- }
- int HeapSort( int a[], int n )
- {
- int i;
- //第一轮按完全二叉树找出这当中最小的值
- //并构成一个完全二叉树,父亲和两个孩子中最小的
- //值放在父亲位置
- for( i = n / 2 - 1; i >=0; i-- )
- {
- adjust( a, i, n );
- }
- //第二轮根据前轮找出的最小值,
- //交换到最结尾,暂时就不再将它纳入二叉树
- //继续从剩余的二叉树中找出最小的值
- //因为前面已经排过二叉数,有一定逻辑顺序
- //因此这次搜寻最小值次数会比第一次明显少很多。
- //这也是堆排序的高明之处!!!
- for( i = n - 1; i > 0; i-- )
- {
- chbSwap( a[0], a[i] );
- adjust( a, 0, i );
- }
- return 1;
- }
- int main( void )
- {
- // int a[NUM] = { 3, 4, 2, 5, 1 };
- int i;
- int a[NUM];
- for( i = 0; i < NUM; i++ )
- {
- a[i] = rand() % NUM;
- }
- //堆排序
- HeapSort( a, NUM );
- for( i = 0; i < NUM; i++ )
- {
- printf( "%d \n", a[i] );
- }
- return 0;
- }
浙公网安备 33010602011771号