Java实现选择排序、插入排序、希尔排序算法

前言:我现在所做的一切,都是为了追求更加完美。——科比


转载请标明出处:http://blog.csdn.net/android_for_james/article/details/51499842

一、选择排序

这种排序方法很直观就是每次从待排序的数据中挑出最小(最大)的与最前面的元素交换,但是并不稳定,稳定的意思就是当有重复元素时有可能在排序完成后顺序有所变化例如{6,6,3}当第一次排序完成后会变成{3,6,6},这时原本第一个6在第二个6之前。

代码实现:

public class Selection_Sort {
	
	public static int[] SelectionSort(int[] a)
	{
		int n=a.length;
		//每次在新的范围内寻找最小的,然后将它与范围的第一个元素替换
		for(int i=0;i<n;i++)
		{
			int min=i;
			for(int j=i+1;j<n;j++)
			{
				if(less(a[j],a[min]))
				{
					min=j;
				}
			}
			exch(a,i,min);
		}
		return a;
	}
	//比较函数
	public static boolean less(Comparable v,Comparable w)  
	{
		return v.compareTo(w)<0;
	}
	//交换函数
	public static void exch(int[] a,int i,int j)
	{
		int t=a[i];
		a[i]=a[j];
		a[j]=t;
	}
	public static void main(String[] args)
	{
		int a[]={1,34,5,6,13,44};
		Selection_Sort s=new Selection_Sort();
		a=Selection_Sort.SelectionSort(a);
		for(int i=0;i<a.length;i++)
		{
			System.out.println(a[i]);
		}
	}

}<span style="color:#993300;">
</span>

二、插入排序
这种排序很类似我们玩扑克牌,每当抽取一张新牌的时候我们都需要将它与手中的有序牌进行对比来找到应该插入的位置。最糟糕的情况就是摸到的牌均为倒序,这时每张牌都得从头对比到尾才能找到位置。

代码实现:

public class Insertion_Sort {
	
	public int[] insertionSort(int a[])
	{
		int length=a.length;
		for(int i=0;i<length;i++)
		{
			
			for(int j=i;j>0&&less(a[j],a[j-1]);j--)
			{
				exch(a,j,j-1);
			}
		}
		return a;
	}
	public static boolean less(Comparable v,Comparable w)
	{
		return v.compareTo(w)<0;
	}
	public static void exch(int a[],int i,int j)
	{
		int t;
		t=a[i];
		a[i]=a[j];
		a[j]=t;
	}
	public static void main(String[] args) {

		int a[]={1,34,5,6,13,44};
		Insertion_Sort insert=new Insertion_Sort();
		a=insert.insertionSort(a);
		for(int i=0;i<a.length;i++)
		{
			System.out.println(a[i]);
		}
	}
}

三、希尔排序

之前插入算法只能够移动相邻元素,这造成了如果需要移动的元素相隔很远时移动次数会很多而且很慢,希尔排序是通过设定一个元素对比间隔n,使得每次对比的元素由原来的只能对比相邻的改变成为可以对比相隔为n的两个数据,直到n=1为止排序完毕。

代码实现:

public class Shell_Sort {
	
	public static int[] shellSort(int[] a)
	{
		int n=a.length;
		int h=1;
		//寻找间隔长度;
		while(h<n/3)
		{
			h=h*3+1;
		}
		//交换不相邻的元素以对数组的局部进行排序
		while(h>=1)
		{
			//每次进行间隔内部的元素交换,如果间隔很大我们可以将数据一次移动很远
			for(int i=h;i<n;i++)
			{
				for(int j=i;j>=h&&less(a[j],a[j-h]);j-=h)
				{
					exch(a,j,j-h);
				}
			}
			//缩小间隔范围直到间隔为1
			h=h/3;
		}
		return a;
	}
	public static boolean less(Comparable v,Comparable w)
	{
		return v.compareTo(w)<0;
	}
	public static void exch(int[] a,int x,int y)
	{
		int t=a[x];
		a[x]=a[y];
		a[y]=t;
		
	}
	public static void main(String[] args) {
		int a[]={1,34,5,6,13,44};
		Shell_Sort shell=new Shell_Sort();
		a=shell.shellSort(a);
		for(int i=0;i<a.length;i++)
		{
			System.out.println(a[i]);
		}
	}
}

如果对你有帮助,那就顶一下~~~

如果你喜欢我的文章欢迎关注我的博客:http://blog.csdn.net/android_for_james




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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值