Java教程

JAVA实现——插入排序、冒泡排序、选择排序、希尔排序

本文主要是介绍JAVA实现——插入排序、冒泡排序、选择排序、希尔排序,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

插入排序

插入排序将数组分为未排序已排序。首先将数组第一个默认为已排序。然后将后面的未排序的元素不断的插入到已排序区域
该排序算法的缺点:每次插入时,都必须将元素与前面已排序的元素比较,来确定正确的位置。这样的话,需要大量的赋值操作。时间复杂度最好O(n)最差O(n^2).稳定算法

	/*插入排序 N为数组个数*/
	static void InsertSort(int[] M)
	{
		int pos=0,temp;
		for (int i = 1; i < M.length; i++) 
		{
			pos=i;
			temp=M[i];
			while (pos>0 && M[pos]<M[pos-1])
			{
				M[pos]=M[pos-1];
				M[pos-1]=temp;
				pos--;
			}
		}   
	}

冒泡排序

元素同样分为已排序和未排序两个区域。该排序算法需要将效率特别低,不建议使用。时间复杂度:最好O(n),最差O(n^2),稳定算法

static void BubbleSort(int[] M)
	{
		int temp; //中间变量
		for (int i = 0; i < M.length-1; i++) 
			for (int j = i+1; j < M.length; j++) 
				if (M[i]>M[j])
					{
						temp=M[j];
						M[j]=M[i];
						M[i]=temp;
					}
	}

选择排序

选择排序每次遍历的时候是选出一个最大值或者最小值的索引,放到数组的指定位置。相比于其他赋值次数较少。时间复杂度:最好O(n)最差O(n^2).不稳定算法。

static void SelectSort(int[] M)
	{
		int pos,temp;
		for (int i = 0; i < M.length-1; i++) 
		{
			pos=i;
			for (int j = i+1; j < M.length; j++)
				if(M[pos]>M[j])  pos=j;
			temp=M[i];
			M[i]=M[pos];
			M[pos]=temp;
		}
	}

希尔排序

由于开始时,步长的取值较大,每个子序列中的元素较少,排序速度较快,到排序后期步长取值逐渐变小,子序列中元素个数逐渐增多,但由于前面工作的基础,大多数元素已经基本有序,所以排序速度仍然很快。当步长取到1的时候,则变为了简单的插入排序。

static void ShellSort(int[] M)
	{
		int gap=M.length/2-1;
		int pos,temp;
		while(gap>0)
		{
			for (int i = 0; i < gap+1; i++) {
				for (int j = i+gap; j < M.length; j+=gap) {
					pos=j;
					temp=M[j];
					while (pos>i && M[pos]<M[pos-gap]) {
						M[pos]=M[pos-gap];
						M[pos-1]=temp;
						pos-=gap;
					}
				}
			}
			gap/=2;
		}
	}

算法的稳定性

考察排序算法的时候有一个很重要的特性,就是算法的稳定性:假定在待排序的记录序列中,存在多个具有相同的关键字的记录,若经过排序,这些记录的相对次序保持不变,则称这种排序算法是稳定的;否则称为不稳定的。

这篇关于JAVA实现——插入排序、冒泡排序、选择排序、希尔排序的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!