您的位置:首页 > 理论基础 > 数据结构算法

数据结构 排序1 交换排序

2009-07-24 17:37 246 查看
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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: