常用的排序算法的时间复杂度和空间复杂度
排序是指将一个无序序列整理成按值非递减顺序排列的有序序列,即是将无序的记录序列调整为有序记录序列的一种操作。
1、交换类排序法(方法:冒泡排序,快速排序)。
2、插入类排序法(方法:简单插入排序,希尔排序)。
3、选择类排序法(方法:简单选择排序,堆排序)。
代码与分析如下:
1 交换类排序:
(1)冒泡排序
//冒泡排序法,稳定的排序, O(n^2)(冒大泡)
#include <stdio.h>
int main (void)
{
int i = 0, j = 0;
int temp = 0;//交换时候的临时变量
int a[9] = {
2, 4, 6, 98, 7, 1, 4, 9, 23
};//数组
int n = 0;//次数计算变量
int out = 0; //计算已经排好的数值的数量
int len = sizeof (a) / sizeof (int);//数组长度
for (i = 0; i < len; ++i)//从第i(起始0)个数开始
{
for (j = i+1; j < len-out; ++j)// 对第j(起始i+1)个数字进行比较 ,-out是为了让已经排好的就不用算了
{
if (a[i] > a[j])// 若第i个数值大于第j个数值,则交换两个数值 ;注:相等不交换,稳定
{
++n;//计算交换的次数
temp = a[i];
a[i] = a[j];
a[j] = temp;
}
else continue;//否则跳出当次循环,让a[i]去比较a[j]的下一个数值 ,直到找到最大值为止
}
++out;//每算出一个就自增一次
}
for (i = 0; i < len; ++i)//打印结果
{
printf ("a[%d] = %d\t",i,a[i]);
}
printf ("count = %d\n",n);
return 0;
}
(2) 快速排序法
//快速排序O(log2^n)
#include <stdio.h>
void myqsort (int a[], int num)
{
int i=0, j=num-1;
int val=a[0];//选择基准值为数组中首个数字 ,用临时变量val存储基准值
if (num>1)//确保数组中元素个数大于1
{
while(i<j)//不重复的遍历,
{
for (;j>i;--j)//底数从0到num-1,从最后一个倒着回来和a[i]比较,
{
if (a[j]<val)//若比基准值小,
{
a[i++] = a[j];//则a[j]值放到基准值当前的位置a[i]上,底数i自增1
break;//找到一个就跳出一次,接着去找大于基准值的数值。
}
}
for (;i<j;++i)//从上面比较后计算得的i开始到同样计算后的j进行遍历比较
{
if (a[i]>val)//若a[i]比基准值大,
{
a[j--] = a[i];//若比基准值大,则上面空缺的a[j]位置由a[i]来填补。
break;
}
}
}
a[i] = val;//确定基准值在数组a中的排序位置,此时,基准值前的值都比基准值小,而后的都比它大。
myqsort(a,i);//递归快排基准值前的数组,
myqsort(a+i+1,num-i-1);//递归快排基准值后的数组。a+i+1的加一和 num-i-1的减一是为了不用对a[i]排序的
}
}
int main (void)
{
int a[9] = {
2, 4, 6, 7, 1, 4, 9, 23, 98
};//比较的数组
int i = 0;
int len = sizeof (a) / sizeof (int);//确定长度
myqsort(a,9);//排序
for ( ; i < len; ++i)//打印
{
printf ("a[%d] = %d\t",i,a[i]);
}
printf ("\n");
return 0;
}
属于学习笔记,纯原创,仅供学习。
代码没有优化,有空再优化,结果无误就是了...欢迎大神们前来指点...