一些排序算法的实现:
系统快排(比较)、选择排序、冒泡排序、插入排序、二分插入排序、希尔排序、快速排序、堆排序
学数据结构时一时兴起部分参考代码写的...
有用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 ;
}
系统快排、选择排序、冒泡排序、插入排序、二分插入排序、希尔排序、快速排序、堆排序
****************************************************************************** */
#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 ;
}