数据结构 排序1 交换排序
1.交换排序的基本思想是:两两比较待排序记录的关键字,发现两个记录的次序相反时即进行交换,直到没有反序的记录为止。
a:冒泡排序:依次抽出所有数和为排出顺序数据进行比较,小的往一个方向靠,其余数留下。如( 3,5,4,2,1,)。首先从最末尾寻找,找到这当中最小的,放到第0个位置,然后又继续从最末尾开始寻找第二个最小的数方到的1个位置,依此类推就找出整个排序。他有个好处就是可以放一个开关,用来判断数据是否按设定的顺序以及排号了,详细看源代码。
- #include <stdio.h>
- #include <stdlib.h>
- #define NUM 6
- //冒泡算法
- int BubbleSort( int a[], int n )
- {
- int i, j, t;
- bool bOK = false;
- for( i = 0; i < n - 1; i++ )
- {
- bOK = false;
- for( j = n - 1; j > i; j-- )
- {
- if( a[j] < a[ j-1 ] )
- {
- t = a[j];
- a[j] = a[j-1];
- a[j-1] = t;
- bOK = true; //如果后面的数都按从小到大排序好了,
- //那么就不会进入此开关,后面就可以立即结束循环。
- }
- }
- if( !bOK )
- return 1;
- }
- return 1;
- }
- int main( void )
- {
- int a[NUM] = { 5, 3, 6, 7, 2, 2 };
- int i;
- //排序算法
- BubbleSort( a, NUM );
- for( i = 0; i < NUM; i++ )
- {
- printf( "%d ", a[ i ] );
- printf( "\n" );
- }
- return 0;
- }
b:快速排序:快速排序是这当中速度最快的,用处最广泛的。其办法是通过与一个关键字比较,大的站右边,小的站左边,关键字来站中间。(^-^)(站住,举起手来,我是警察,男的站左边,女的站右边,嗯……………..老师它站那里,呵呵,变态的站中间!) (^-^)。然后依此类推,直到剩下两个数,比出他们高矮后就完事了。
快速排序的三部曲:
分解( Divide ):将原问题分成两半,一边大一边小。
求解( Conquer ):小的有分大和小两边,大的那边同理。递归完个组。
组合( Combine ):将排号高矮的连成一排就是结果了。
详细步骤看代码:
- #include <stdio.h>
- #include <stdlib.h>
- #define NUM 100
- //以a[beg]为标杆,比该数小的站左边,比该数大的
- //站右边,然后返回标杆所处的位置。
- int PartNode( int a[], int beg, int end )
- {
- int i, t, s, key;
- key = a[beg];
- s = end;
- for( i = end - 1; i > beg; i-- )
- {
- if( key < a[i] ) //比标杆长的统统往右移,与比标杆小的交换位置
- {
- s--;
- t = a[i];
- a[i] = a[s];
- a[s] = t;
- }
- }
- s--;
- t = a[s];
- a[s] = a[beg];
- a[beg] = t;
- return s;
- }
- //快速排序
- int QuickSort( int a[], int beg, int end )
- {
- if( beg >= end - 1 )
- return 1;
- int i = 0;
- i = PartNode( a, beg, end );
- QuickSort( a, beg, i ); //排列比标杆矮的数据。
- QuickSort( a, i+1, end ); //排列比标杆高的数据
- return 1;
- }
- int main( void )
- {
- //int a[NUM] = { 5, 3, 6, 7, 2, 2 };
- int i;
- int a[NUM];
- for( i = 0; i < NUM; i++ )
- {
- a[i] = rand() % NUM;
- }
- //排序算法
- QuickSort( a, 0, NUM );
- for( i = 0; i < NUM; i++ )
- {
- printf( "%d ", a[ i ] );
- printf( "\n" );
- }
- return 0;
- }
1.交换排序的基本思想是:两两比较待排序记录的关键字,发现两个记录的次序相反时即进行交换,直到没有反序的记录为止。
a:冒泡排序:依次抽出所有数和为排出顺序数据进行比较,小的往一个方向靠,其余数留下。如( 3,5,4,2,1,)。首先从最末尾寻找,找到这当中最小的,放到第0个位置,然后又继续从最末尾开始寻找第二个最小的数方到的1个位置,依此类推就找出整个排序。他有个好处就是可以放一个开关,用来判断数据是否按设定的顺序以及排号了,详细看源代码。
- #include <stdio.h>
- #include <stdlib.h>
- #define NUM 6
- //冒泡算法
- int BubbleSort( int a[], int n )
- {
- int i, j, t;
- bool bOK = false;
- for( i = 0; i < n - 1; i++ )
- {
- bOK = false;
- for( j = n - 1; j > i; j-- )
- {
- if( a[j] < a[ j-1 ] )
- {
- t = a[j];
- a[j] = a[j-1];
- a[j-1] = t;
- bOK = true; //如果后面的数都按从小到大排序好了,
- //那么就不会进入此开关,后面就可以立即结束循环。
- }
- }
- if( !bOK )
- return 1;
- }
- return 1;
- }
- int main( void )
- {
- int a[NUM] = { 5, 3, 6, 7, 2, 2 };
- int i;
- //排序算法
- BubbleSort( a, NUM );
- for( i = 0; i < NUM; i++ )
- {
- printf( "%d ", a[ i ] );
- printf( "\n" );
- }
- return 0;
- }
b:快速排序:快速排序是这当中速度最快的,用处最广泛的。其办法是通过与一个关键字比较,大的站右边,小的站左边,关键字来站中间。(^-^)(站住,举起手来,我是警察,男的站左边,女的站右边,嗯……………..老师它站那里,呵呵,变态的站中间!) (^-^)。然后依此类推,直到剩下两个数,比出他们高矮后就完事了。
快速排序的三部曲:
分解( Divide ):将原问题分成两半,一边大一边小。
求解( Conquer ):小的有分大和小两边,大的那边同理。递归完个组。
组合( Combine ):将排号高矮的连成一排就是结果了。
详细步骤看代码:
- #include <stdio.h>
- #include <stdlib.h>
- #define NUM 100
- //以a[beg]为标杆,比该数小的站左边,比该数大的
- //站右边,然后返回标杆所处的位置。
- int PartNode( int a[], int beg, int end )
- {
- int i, t, s, key;
- key = a[beg];
- s = end;
- for( i = end - 1; i > beg; i-- )
- {
- if( key < a[i] ) //比标杆长的统统往右移,与比标杆小的交换位置
- {
- s--;
- t = a[i];
- a[i] = a[s];
- a[s] = t;
- }
- }
- s--;
- t = a[s];
- a[s] = a[beg];
- a[beg] = t;
- return s;
- }
- //快速排序
- int QuickSort( int a[], int beg, int end )
- {
- if( beg >= end - 1 )
- return 1;
- int i = 0;
- i = PartNode( a, beg, end );
- QuickSort( a, beg, i ); //排列比标杆矮的数据。
- QuickSort( a, i+1, end ); //排列比标杆高的数据
- return 1;
- }
- int main( void )
- {
- //int a[NUM] = { 5, 3, 6, 7, 2, 2 };
- int i;
- int a[NUM];
- for( i = 0; i < NUM; i++ )
- {
- a[i] = rand() % NUM;
- }
- //排序算法
- QuickSort( a, 0, NUM );
- for( i = 0; i < NUM; i++ )
- {
- printf( "%d ", a[ i ] );
- printf( "\n" );
- }
- return 0;
- }
浙公网安备 33010602011771号