九大排序法

直接插入

每趟操作分为比较关键字和移动元素,比较次数和移动次数取决于待排序表的初始状态。

1待排序正序时,比较n-1次,交换0次

2待排序逆序时,比较n(n-1)/2次,交换n(n-1)/2次

//直接插入排序
void insert(ElemType a[],int n)
{
	for(i=2;i<=n;i++)
		if(a[i]<a[i-1])
		{
			a[0]=a[i];	
			for(j=i-1;a[0]<a[j];j--)
			{
				a[j+1]=a[j];
			}
			a[j+1]=a[0];
		}
}

简单选择

比较次数与待排序序列原始状态无关,无论何时,比较次数n(n-1)/2次

1待排序序列正序时,交换次数0次,

2最差情况(不是反序) 交换n-1次

性能优于冒泡排序

//简单选择
void select(ElemType a[],int n)
{
	for(i=0;i<n-1;i++)
	{
		min=i;	//记录最小元素位置
		for(j=i+1;j<n;j++)
		{
			if(a[j]<a[min])
				min=j;
		}
		if(min!=i)
		swap(a[min],a[i]);
	}
}

希尔排序(插入排序)

对直接插入排序,“正序”时,时间复杂度可以提高至O(n), 适用于基本有序或者数据量不大的排序表。对其改进。。。

希尔时间复杂度依赖增量序列的函数,最坏O(n2).

仅适用于线性表为顺序存储的情况。

冒泡

1.待排序正序时,比较n-1次,交换0次

2.逆序时,比较n(n-1)/2次,交换n(n-1)/2次.

void Bubble(ElemType a[],int n)
{
	for(i=0;i<n-1;i++)
	{
		flag=false;
		for(j=n-1;j>i;j--)
		{
			if(a[j-1]>a[j])
			{
				swap(a[j-1],a[j]);
				flag=true;
			}
		}
		if(flag==false)
			return;
	}
}

快速排序

平均性能最好。

初始序列基本有序时,退化为起泡排序。

int huafen(ElemType A[],int low,int high)
{
	ElemType p=A[low];  //第一个元素作为首元
	while(low<high)
	{
		while(low<high&&A[high]>=p) high--;
		A[low]=A[high];
		while(low<high&&A[low]<=p) low++;
		A[high]=A[low];
	}
	A[low]=p;
	return low;	//返回存放枢轴的最终位置
}
void quick(ElemType A[],int low,int high)
{
	if(low<high)
	{
		int pos=huafen(A,low,high);
		quick(A,low,pos-1);
		quick(A,pos+1,high);
	}
}

堆排序

堆是计算机科学中一类特殊的数据结构的统称,可以看做一棵完全二叉树的数组对象。满足根的值小于等于所有子树结点的值,称为小堆;根的值大于等于所有子树结点的值称为大堆。

堆排序时间复杂度O(nlogn). 建堆O(n)。n-1次向下调整操作。每次调整O(h).

空间复杂度 O(1)

归并排序

归并排序 属于外部排序

基数排序(桶排序)

基数排序是一种借助多关键字排序的思想对单逻辑关键字进行排序的算法。

时间效率:O(d*(n+r))             d趟分配 一趟分配O(n), 一趟收集O(r)

与序列初始状态无关

空间效率 O(r)     r个队列的首尾指针

稳定的排序算法指的是,对于两个关键字相等的记录,它们在序列中的相对位置,在排序之前和经过排序之后,没有改变。

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值