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