排序算法(1)



常用的排序算法的时间复杂度和空间复杂度

排序法

最差时间分析平均时间复杂度 稳定度 空间复杂度
冒泡排序O(n2)O(n2) 稳定 O(1)
快速排序O(n2)O(n*log2n) 不稳定 O(log2n)~O(n)
选择排序O(n2)O(n2) 稳定 O(1)
二叉树排序O(n2)O(n*log2n) 不一定O(n)

插入排序

O(n2)O(n2) 稳定 O(1)
堆排序O(n*log2n) O(n*log2n) 不稳定 O(1)
希尔排序OO 不稳定 O(1)



排序是指将一个无序序列整理成按值非递减顺序排列的有序序列,即是将无序的记录序列调整为有序记录序列的一种操作。

  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;
}


属于学习笔记,纯原创,仅供学习。

代码没有优化,有空再优化,结果无误就是了...欢迎大神们前来指点...

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值