排序小节

直接插入排序:
public static void InsertSort(int []R)//排序数存在R数组中,R[1],R[2].....
{
	for(int i=2; i<R.length(); i++)
	{
		if(R[i]<R[i-1])
		{
			R[0] = R[i];
				for(int j=i-1; R[j]>R[0]; j--)
					R[j+1]=R[j];//后移一位
			R[j+1] = R[0];//插入到合适的位置
		}
	}
}
直接插入排序时间复杂度o平方,空间复杂度1,比较适合有序性较好的排列。




对直接插入排序进行优化,希尔排序
public static void ShellSort(int []R,int []d)//R是待排序列,d是递减的步长序列,
{
	for(int k=0;k<d.length;k++)
	{
		int h = d[k];//本趟的增量
		for(int i=h+1;i<R.length();i++)
		{
			if(R[i]<R[i-h])
			{
				R[0] = R[i];
				for(int j=i-h;R[j]<R[0]&&j>0;j=j-h)
					R[j+h]=R[j];//后移
				R[j+h] = R[0];//插入到正确位置
			}
		}
	}
}
对于希尔排序,注意步长序列除1外,不应有共因子,且最后一个步长因子一定为1,这是一个不稳定的排序算法。




冒泡排序:
public static void Bubble_Sort(int []R,int n)
{
    int i, j, temp;
    for (j = 0; j < n - 1; j++)
        for (i = 0; i < n - 1 - j; i++)
        {
            if(a[i] > a[i + 1])
            {
                temp = a[i];
                a[i] = a[i + 1];
                a[i + 1] = temp;
            }
        }
}
冒泡排序就是相邻两个数进行比较,时间复杂度是o的平方,空间复杂度是1,稳定的排序算法。


快速排序:采用分治策略,排序a[p:r]
1,首先将a[p:r]分解为a[p:q-1],a[q],a[q+1:r]三部分a[p:q-1]任何元素都小于a[q],a[q+1,r]任何元素都大于a[q];
2, 分别对a[p,q-1]和a[q+1,r]进行快速排序;
3,三部分进行合并;
public static void  QuickSort(int []data,int low,int high)
{
	if(low<high)
		return;
	int i=low;
	int j=high;
	int p=data[low];
	while(i<j)
	{
		while(i<j && data[j]>=p) j--;
		if(i<j) data[i++]=data[j];
		while(i<j && data[i]<=p) i++;
		if(i<j) data[j--]=data[i];
	}
	data[i]=p;
	QuickSort(data,low,i-1);
	QuickSort(data,i+1,high);
}
快速排序的时间复杂度nlogn,是不稳定的排序。


堆排序;判断一个序列是不是堆,可以和一颗完全二叉树对应起来。
堆排序是不稳定的排序算法,时间复杂度为ologn;


归并排序:
两个有序表的合并:
public static void Merge(int []R,int []R1,int s,int m,int t)
{
	//两个有序子表R[s]...R[m]和R[m+1]...R[t],将这两个有序子表合并为R1
	i=s;
	j=m+1;
	k=s;
	while(i<=m && j<=t)
	{
		if(R[i]<R[j])
			R1[k++]=R[i++];
		else
			R1[k++]=R[j++];
	}
	while(i<=m)
		R1[k++]=R[i++];
	while(j<=t)
		R1[k++]=R[j++];
}

二路归并算法的基本思想:只有1个元素的表是有序的,所以排序表可以看作是n个长度为1的有序子表,将相邻
的两个有序子表合并,最后生成长度为n的有序表,整个过程需要logn趟。
二路归并算法的递归实现:
public static void MSort(int []R,int []R1,int s,int t)
{
	//将R[s]...R[t]归并排序为R1[s]...R1[t]
	if(s==t) R1[s] = R[s];
	else{
		int m =(s+t)/2;
		MSort(R,R1,s,m);//递归R[s...m]归并为有序的R1[s...m]
		MSort(R,R1,m+1,t);//递归R[m+1...t]归并为有序的R1[m+1...t]
		Merge(R1,R,s,m,t);//将R1[s...m]和R1[m+1...t]归并到R[s...t]
	}
}
归并算法的时间复杂度为ologn,是一种稳定的排序算法,但是他需要一个与表等长的辅助元素数组空间。
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值