被快排整的头疼,以后再写,先写三个简单的排序(冒泡、选择、插入)轻松一下吧
先看一下对几种排序算法的测试结果
先看一下对几种排序算法的测试结果
/*
* 对10万随机数排序测试结果:
*
* 速度排名 算法 平均时间
*
* 1 quick_sort 12 ms
* 2 qsort 15 ms
* 3 insert_sort 7851 ms
* 4 select_sort 11292 ms
* 5 bubble_sort 23364 ms
*
* CPU:i3-2120 3.30GHz
*
*/
第一次看到这个结果时被吓到了,没想到快排跟冒泡差距有这么大,看来高效的算法在性能提升上不是一点点哦。要好好学学算法了
1)冒泡排序
/*--------------------------------------- ------------------------------------
原理:大家都懂的
时间复杂度:O(n^2)
描述:编写最简单,效率最低
------------------------------------------------------------------------------*/
void bubble_sort(int *a,int len)
{
int i,j,t;
for(i=0;i<len-1;i++){
for(j=i+1;j<len;j++){
if(a[i]>a[j]){
t=a[i];a[i]=a[j];a[j]=t;
}
}
}
}
2)插入排序
/*--------------------------------------- ------------------------------------
原理:通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描
找到相应位置并插入
时间复杂度:O(n^2)
最好情况:序列是升序排列, 比较操作需(n-1)次
最坏情况:序列是降序排列 ,比较操作需 n(n-1)/2 次
描述:插入排序不适合对于数据量比较大的排序应用。但是,如果需要排序的数据量很小
例如量级小于千,那么插入排序还是一个不错的选择。
------------------------------------------------------------------------------*/
void insert_sort(int *a,int len)
{
int i,j,t;
for(i=1;i<len;i++){
t=a[i];
j=i-1;
while(t<a[j]){
a[j+1]=a[j--];
}
a[j+1]=t;
}
}
3)选择排序
/*--------------------------------------- ------------------------------------
原理:首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置
然后,再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾
时间复杂度:O(n^2)
最好情况是,已经有序,交换0次
最坏情况是,逆序,交换n-1次
描述:交换次数比冒泡排序少多了,由于交换所需CPU时间比比较所需的CPU时间多
n值较小时,选择排序比冒泡排序快。
------------------------------------------------------------------------------*/
void select_sort(int *a,int len)
{
int min_index,index,t,i;
for(i=0;i<len-1;i++){
min_index=i;
for(index=i;index<len-1;index++){
if(a[index]<a[min_index]){
min_index=index;
}
}
if(min_index!=i){
t=a[i];
a[i]=a[min_index];
a[min_index]=t;
}
}
}