Peck Chen

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

一些排序算法的实现:

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

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

有用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  阅读(249)  评论(0编辑  收藏  举报