排序算法实现(To be continue...)

本文实现了一系列排序算法,包括系统快排、选择排序、冒泡排序、插入排序等,并通过clock()函数统计了每种算法的运行时间。

一些排序算法的实现:

系统快排(比较)、选择排序、冒泡排序、插入排序、二分插入排序、希尔排序、快速排序、堆排序

学数据结构时一时兴起部分参考代码写的...

有用clock()统计时间...就没有写出各个算法的复杂度了

还有些没有实现...二路归并,基数排序之类的...

 

代码

      
/* ******************************************************************************
系统快排、选择排序、冒泡排序、插入排序、二分插入排序、希尔排序、快速排序、堆排序
******************************************************************************
*/
#include
< stdio.h >
#include
< stdlib.h >
#include
< string .h >
#include
< time.h >
#define len 100000 // 100000000

int qs[len], sel[len], binser[len], shell[len], bub[len],
inser[len], qus[len], heap[len];
int desc[] = { 7 , 5 , 3 , 1 }; // 缩小增量

int cmp( const void * a, const void * b )
{
return * ( int * )a - * ( int * )b;
}

void select_sort( int elem[], int length )
{
int i, j, min, index;

for ( i = 0 ; i < length - 1 ; i ++ )
{
min
= i;
for (j = i + 1 ; j < length; j ++ )
if (elem[min] > elem[j]) min = j;

index
= elem[min];
elem[min]
= elem[i];
elem[i]
= index;
}
}

void bubble_sort( int elem[], int length )
{
int i, j, index;

for (i = 1 ; i < length; i ++ )
{
for ( j = 0 ; j < length - i; j ++ )
{
if ( elem[j] > elem[j + 1 ] )
{
index
= elem[j];
elem[j]
= elem[j + 1 ];
elem[j
+ 1 ] = index;
}
}
}
}

void insert_sort( int elem[], int length )
{
int i, j, index;

for ( i = 1 ; i < length; i ++ )
{
if ( elem[i] < elem[i - 1 ] )
{
index
= elem[i];
for ( j = i - 1 ; index < elem[j] && j >= 0 ; j -- )
elem[j
+ 1 ] = elem[j];

elem[j
+ 1 ] = index;
}
}
}
// 直接插入排序

void binsert_sort( int str[], int length )
{
int i, j, low, mid, high; int index;
for (i = 1 ; i < length; i ++ )
{
if ( str[i] < str[i - 1 ] )
{
index
= str[i];
low
= 1 ; high = i;
while ( low <= high )
{
mid
= ( low + high ) / 2 ;
if ( index < str[mid - 1 ] )
{
high
= mid - 1 ;
}
else low = mid + 1 ;
}
for (j = i - 1 ; j >= high; j -- )
{
str[j
+ 1 ] = str[j];
}

str[high]
= index;
}
}
}
// 二分插入排序

void shell_insert( int * num, int m, int len )
{
int i, j, tmp;

for ( i = m; i < len; i += m )
{
if ( num[i] < num[i - m] )
{
tmp
= num[i];
for ( j = i - m; j >= 0 && tmp < num[j]; j -= m )
{
num[j
+ m] = num[j];
}
num[j
+ m] = tmp;
}
}
}

void shell_sort( int num[], int desc[], int len )
{
int i;

for ( i = 0 ; i < 4 ; i ++ )
{
shell_insert( num, desc[i], len );
}
}
// 希尔插入排序

void quick_sort( int str[], int x, int y )
{
if ( x >= y ) return ;

int i, j, index;

i
= x;
j
= y;
index
= str[x];
if ( i < j )
{
while ( i < j )
{
while ( i < j && index <= str[j] ) j -- ;
if ( i < j )
{
str[i]
= str[j];
i
++ ;
}
while ( i < j && index >= str[i] ) i ++ ;
if ( i < j )
{
str[j]
= str[i];
j
-- ;
}
}
str[j]
= index;

quick_sort( str, x, j
- 1 );
quick_sort( str, j
+ 1 , y );
}
}
// 快速排序

void adjust_heap( int elem[], int top, int m )
{
int temp; int j;

temp
= elem[top - 1 ];
for ( j = 2 * top; j <= m; j *= 2 )
{
if ( j < m && elem[j - 1 ] < elem[j] ) ++ j;
if ( temp > elem[j - 1 ] ) break ;
elem[top
- 1 ] = elem[j - 1 ]; top = j;
}
elem[top
- 1 ] = temp;
}
// 堆排序:heap_sort、adjust_heap

void heap_sort( int elem[], int length )
{
int i, temp;

for ( i = len / 2 ; i > 0 ; i -- )
{
adjust_heap( elem, i, length );
}
// 调整len/2个顶点

for ( i = length; i > 1 ; i -- )
{
temp
= elem[ 0 ];
elem[
0 ] = elem[i - 1 ];
elem[i
- 1 ] = temp;

adjust_heap( elem,
1 , i - 1 );
}
}
// 堆排序:HeapSort、AdjustHeap

void print( int elem[], int length )
{
int i;

for ( i = 0 ; i < length; i ++ )
{
printf(
" %2.2d " , elem[i] );
if ( ( i + 1 ) % 20 == 0 )
{
putchar(
' \n ' );
}
}
putchar(
' \n ' );
}
// 输出

int main()
{
time_t start, end;
char flag[ 10 ]; int i;

while ( scanf( " %s " , flag ), strcmp( flag, " end " ) )
{
for ( i = 0 ; i < len; i ++ )
{
qs[i]
= sel[i] = bub[i] = inser[i]
= binser[i] = qus[i] = heap[i] = rand() % 100 ;
}

start
= clock();
qsort( qs, len,
sizeof (qs[ 0 ]), cmp );
end
= clock();
printf(
" system_qsort:\n%d秒\n\n " , (end - start) / CLOCKS_PER_SEC );
// print( qs, len );
system( " pause " );
start
= clock();
select_sort( sel, len );
end
= clock();
printf(
" select_sort:\n%d秒\n\n " , (end - start) / CLOCKS_PER_SEC );
// print( sel, len );
system( " pause " );
start
= clock();
bubble_sort( bub, len );
end
= clock();
printf(
" bubble_sort:\n%d秒\n\n " , (end - start) / CLOCKS_PER_SEC );
// print( bub, len );
system( " pause " );
start
= clock();
insert_sort( inser, len );
end
= clock();
printf(
" insert_sort:\n%d秒\n\n " , (end - start) / CLOCKS_PER_SEC );
// print( inser, len );
system( " pause " );
start
= clock();
binsert_sort( binser, len );
end
= clock();
printf(
" binsert_sort:\n%d秒\n\n " , (end - start) / CLOCKS_PER_SEC );
// print( inser, len );
system( " pause " );
start
= clock();
shell_sort( shell, desc, len);
end
= clock();
printf(
" shell_sort:\n%d秒\n\n " , (end - start) / CLOCKS_PER_SEC );
// print( inser, len );
system( " pause " );
start
= clock();
quick_sort( qus,
0 , len - 1 );
end
= clock();
printf(
" quick_sort:\n%d秒\n\n " , (end - start) / CLOCKS_PER_SEC );
// print( qus, len );
system( " pause " );
start
= clock();
heap_sort( heap, len );
end
= clock();
printf(
" heap_sort:\n%d秒\n\n " , (end - start) / CLOCKS_PER_SEC );
// print( heap, len );
system( " pause " );
}

return 0 ;
}
posted on 2010-11-02 17:21 PeckChen 阅读( ...) 评论( ...) 编辑 收藏

转载于:https://www.cnblogs.com/xyoung/archive/2010/11/02/1867358.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值