_____谈谈排序算法
交换排序——>冒泡排序-->快速排序
选择排序——>简单选择排序——>堆排序
插入排序——>直接插入排序——>希尔排序
_____排序算法对比
名称 |
稳定性 |
时间复杂度 |
空间复杂度 |
描述 |
数据对象为链表 |
||
平均 |
最坏 |
||||||
冒泡排序 |
Y |
O(n^2) |
O(1) |
无序区,有序区。 |
|
||
选择排序 |
|
O(n^2) |
O(1) |
有序区,无序区 |
稳定性Y,其它同数组 |
||
插入排序 |
Y |
O(n^2) |
O(1) |
有序区,无序区 |
同数组 |
||
堆排序 |
|
O(n log n) |
O(1) |
最大堆,有序区 |
|
||
归并排序 |
Y |
O(n log n) |
O(n)+O(log n) |
将数据分为两段,逐段排序 |
空间复杂度O(1) |
||
快速排序 |
|
O(n log n) |
O(n^2) |
O(log n)-O(n) |
选择基数,调整方位 |
|
|
希尔排序 |
|
O(n log n) |
O(n^2) |
O(1) |
每次循环按间隔进行插入排序 |
|
快速排序针对小数目数组列表的优化为最佳的排列方法。
-------库函数
在stdlib 中定义了qsort库函数
void qsort (void* base, size_t num, size_t size, int (*compar)(const void*,const void*));
//这是一个泛型函数,适用于不同的类型。
int compareMyType (const void * a, const void * b) { if ( *(MyType*)a < *(MyType*)b ) return -1; if ( *(MyType*)a == *(MyType*)b ) return 0; if ( *(MyType*)a > *(MyType*)b ) return 1; }
//我写的
void quickSort(void* base,size_t size,size_t low,size_t high,int (*compar)(const void*,const void*)) { int left = low; int right = high; int keyPos = low; //set the first element key uchar keyBuffer[size]; if(low >= high) return; memcpy( keyBuffer, (uchar *)base + keyPos*size, size ); while(right>left ) { while( right>left && compar( (uchar *)base + right*size,keyBuffer )>=0) { right--; } memcpy( (uchar *)base + left*size, (uchar *)base + right*size, size ); //right considered to store key while( right>left && compar(keyBuffer, (uchar *)base + left*size)>=0 ) { left++; } memcpy( (uchar *)base + right*size, (uchar *)base + left*size, size ); //left considered to store key } memcpy((uchar *)base + left*size,keyBuffer,size); if(left-1>0) quickSort(base,size,low,left-1,compar); quickSort(base,size,left+1,high,compar); } void qsort (void* base, size_t num, size_t size, int (*compar)(const void*,const void*)) { quickSort(base,size,0,num-1,compar); }