数据结构之排序

/*

 *@date:08-07-11

 *@descript:几种常用排序的实现与应用

 **/

import java.io.*;

import java.util.Random;

public class Sort

{

	public Sort()

	{

	}

	// 冒泡排序

	public void bubbleSort(int[] arry)

	{

		int len=arry.length;

		for(int i=1;i<len;i++)

		{

			for(int j=0;j<len-1;j++)

			{

				if(arry[j]>arry[j+1])

				{

					int temp=arry[j];

					arry[j]=arry[j+1];

					arry[j+1]=temp;

				}

			}

			display(arry);

		}



	}

	//快速排序

	public void quickSort(int[] arry,int low,int high)

	{

		int i=low;

		int j=high;

		int temp=arry[low];

		while(i<j)

		{

			//在数组右边进行比较

			while(i<j && temp<=arry[j])

			{

				j--;

			}

			if(i<j)

			{

				arry[i]=arry[j];

				i++;

			}

			//在数组左边进行比较

			while(i<j && arry[i]<temp)

			{

				i++;

			}

			if(i<j)

			{

				arry[j]=arry[i];

				j--;

			}

			arry[i]=temp;

			if(low<i)

			{

				quickSort(arry,low,i-1);//对左端的数据进行递归

			}

			if(i<high)

			{

				quickSort(arry,j+1,high);//对右端的数据进行递归

			}

			

		}

		display(arry);

	}

	//直接插入排序

	public void insertSort(int[] arry)

	{

		for(int i=0;i<arry.length-1;i++)

		{

			int temp=arry[i+1];

			int j=i;

			//arry[j]<temp则已有序,否则将temp插入到arry[j]前面

			while(j>-1 && temp<=arry[j])

			{

				arry[j+1]=arry[j];

				j--;

			}

			arry[j+1]=temp;

			display(arry);

		}

	}

	//希尔排序

	public void shellSort(int[] arry,int len)

	{

		int d=len/2;

		while(d>0)

		{



				for(int i=d;i<arry.length;i++)

				{

					int temp=arry[i];

					int j=i-d;

					while(j>-1 && temp<=arry[j])

					{

						arry[j+d]=arry[j];

						j-=d;

					}

					arry[j+d]=temp;

					display(arry);

				}

				d=d/2;

				

		

		}

		

	}

	//直接选择排序

	public void selectSort(int[] arry)

	{

		for(int i=0;i<arry.length-1;i++)

		{

			int small=i;

			for(int j=i+1;j<arry.length;j++)

			{

				if(arry[j]<arry[small])

				{

					small=j;

				}

			}

			if(small!=i)

			{

				int temp=arry[small];

				arry[small]=arry[i];

				arry[i]=temp;

			}

			display(arry);

		}

	}

	//归并排序

	public void mergerSort(int[] arry,int[] arryTemp,int left,int mid,int righ)

	{

		

		int i=left;

		int j=mid+1;

		int k=left;

		while((i<=mid)&&(j<=righ))

		{

			if(arry[i]<arry[j])

			{

				arryTemp[k++]=arry[i++];

			}else

			{

				arryTemp[k++]=arry[j++];

			}

		}

		

		while(i<=mid)

		{

			arryTemp[k++]=arry[i++];

		}

		while(j<=righ)

		{

			arryTemp[k++]=arry[j++];

		}

		//将数组arryTemp 中的数据复制到 arry 中

		for (int t = left; t<=righ; t++)

	    {

	    	arry[t]=arryTemp[t];

	    }

	}

	public void mSort(int[] arry,int left,int righ)

	{

		int [] arryTemp=new int[arry.length];

		if(left<righ)

		{

			int mid=(left+righ)/2;

			mSort(arry,left,mid);

			mSort(arry,mid+1,righ);

			mergerSort(arry,arryTemp,left,mid,righ);

		}

		display(arry);

	}

	//输出数据元素

	public void display(int[] arry)

	{

		for (int i = 0; i<arry.length; i++)

	    {

	    	System.out.print(arry[i]+",");

	    }

	    System.out.println ();

	}

	//显示排序名称

	public void display(String sortName)

	{

		System.out.println (sortName+":");

	}

	//菜单界面

	public void MenuShow(int[] arry)

	{

		String str=null;

		int []increment={3,1};//希尔排序的增量 

		try{

				do

				{

					System.out.println ("/t"+"/t"+"/t"+"1 冒泡排序");

					System.out.println ("/t"+"/t"+"/t"+"2 快速排序");

					System.out.println ("/t"+"/t"+"/t"+"3 直接插入排序");

					System.out.println ("/t"+"/t"+"/t"+"4 希尔排序");

					System.out.println ("/t"+"/t"+"/t"+"5 选择排序");

					System.out.println ("/t"+"/t"+"/t"+"6 归并排序");

					System.out.println ("/t"+"/t"+"/t"+"请选择您要执行的排序方式:1-6");

					BufferedReader br=new BufferedReader(new InputStreamReader(System.in));

					str=br.readLine();

					int choice=new Integer(str);

					switch(choice)

					{

						case 1:

							//调用冒泡排序算法

							display("冒泡排序");

							bubbleSort(arry);

							break;

						case 2:

							//调用快速排序算法

							display("快速排序");

							quickSort(arry,0,arry.length-1);

							break;

						case 3:

							//调用直接插入排序算法

							display("直接插入排序");

							insertSort(arry);

							break;

						case 4:

							//调用希尔排序算法

							display("希尔排序");

							shellSort(arry,arry.length);

							break;

						case 5:

							//调用选择排序算法

							display("选择排序");

							selectSort(arry);

							break;

						case 6:

							//调用归并排序算法

							display("归并排序");

							mSort(arry,0,arry.length-1);

							break;

						default:

							System.out.println ("没有您要的选择! ");

					}

					System.out.println ("继续/退出? y/n");

					str=br.readLine();

				}while("y".equals(str)||"Y".equals(str));

				

	    }

	    catch (Exception ex){

	    	ex.printStackTrace();

	    }

	

	}

	public static void main(String[] args)

    {

    	Random rand=new Random();

    	int []arryE=new int[500];

    	for(int i=0;i<500;i++)

    	{

    		arryE[i]=rand.nextInt();	

    	}

    	Sort sort=new Sort();

    	int[] arry={38,5,19,26,49,97,1,66};

		sort.display("原始数据序列");

		//如果要用上面的随机数进行排序,仅需将  arryE 数组作为参数传过去

    	sort.display(arry);

    	sort.MenuShow(arry);

    }



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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值