内部排序

数据结构里学了好多排序的算法,现在来整理一下吧

收集了几个排序算法的舞蹈,一起感受程序员的艺术吧

插入排序:http://rrurl.cn/jgVFb1

希尔排序:http://rrurl.cn/bk5ivP

快速排序:http://rrurl.cn/sPoa91

归并排序:http://rrurl.cn/bDwSo7

下面用简易的代码实现各种排序的算法

输入10个整形数并进行排序

import java.util.Scanner;
//插入排序
class InsertSort
{
	int[] a=new int[11];
	public void init(int[] b)
	{
		for(int i=0;i<11;i++)
		a[i]=b[i];
	}
	public void insertsort()
	{
		System.out.println("插入排序");
		for(int i=2;i<11;i++)
		{
			if(a[i]<a[i-1])
			{
				a[0]=a[i];//a[0]作为哨兵
				a[i]=a[i-1];
				int j;
				for(j=i-2;;j--)
				{
					if(a[0]<a[j])
					{
						a[j+1]=a[j];
					}
					else
					break;
				}
				a[j+1]=a[0];
			}
		}
		for(int i=1;i<11;i++)
		{
			System.out.print(a[i]);
			System.out.print(' ');
		}
		System.out.print("\n");
	}
}
class ShellSort
{
	int[] a=new int[11];
	int[] dlta=new int[]{5,3,1};
	public void init(int[] b)
	{
		for(int i=0;i<11;i++)
		a[i]=b[i];
	}
	public void shellinsort(int dk)
	{
		for(int i=dk+1;i<11;i++)
		{
			if(a[i]<a[i-dk])
			{
				a[0]=a[i];
				int j;
				for(j=i-dk;j>0;j-=dk)
				{
					if(a[0]<a[j])
					a[j+dk]=a[j];
					else 
					break;
				}
				a[j+dk]=a[0];
			}
		}
	}
	public void shellsort()
	{
		System.out.println("希尔排序");
		for(int i=0;i<3;i++)
		shellinsort(dlta[i]);
		for(int i=1;i<11;i++)
		{
			System.out.print(a[i]);
			System.out.print(' ');
		}
		System.out.print("\n");
	}
}
class QuitSort
{
	int[] a=new int[11];
	public void init(int[] b)
	{
		for(int i=0;i<11;i++)
		a[i]=b[i];
	}
	public int partition(int low,int high)
	{
		a[0]=a[low];
		int pivotkey=a[low];
		while(low<high)
		{
			while(low<high&&a[high]>=pivotkey)
			high--;
			a[low]=a[high];
			while(low<high&&a[low]<=pivotkey)
			low++;
			a[high]=a[low];
		}
		a[low]=a[0];
		return low;
	}
	public void quitsort(int low,int high)
	{
		if(low<high)
		{
			int pivotloc=partition(low,high);
			quitsort(low,pivotloc-1);
			quitsort(pivotloc+1,high);
		}
	}
	public void print()
	{
		System.out.println("快速排序");
		for(int i=1;i<11;i++)
		{
			System.out.print(a[i]);
			System.out.print(' ');
		}
		System.out.print("\n");
	}
}
class MergeSort
{
	int[] a=new int[11];
	public void init(int[] b)
	{
		for(int i=0;i<11;i++)
		a[i]=b[i];
	}
	public void merge(int l,int m,int r)
	{
		int i,j,k;
		int[] d=new int [11];
		i=l;
		j=m+1;
		k=1;
		while(i<=m&&j<=r)
		{
			if(a[i]<=a[j])
			d[k++]=a[i++];
			else
			d[k++]=a[j++];
		}
		while(i<=m)
		d[k++]=a[i++];
		while(j<=r)
		d[k++]=a[j++];
		for(i=l,k=1;i<=r;i++,k++)  
		a[i]=d[k];  
	}
	public void mergesort(int left,int right)
	{
		int mid;
		if(left<right)
		{
			mid=(left+right)/2;
			mergesort(left,mid);
			mergesort(mid+1,right);
			merge(left,mid,right);
		}
	}
	public void print()
	{
		System.out.println("归并排序");
		for(int i=1;i<11;i++)
		{
			System.out.print(a[i]);
			System.out.print(' ');
		}
		System.out.print("\n");
	}
}
class HeapSort
{
	int[] a=new int[11];
	public void init(int[] b)
	{
		for(int i=0;i<11;i++)
		a[i]=b[i];
	}
	//数组中除了a[s]均满足堆的定义,本函数调整a[s],使其仍为一个大顶堆  
	public void heapsort(int s,int m)
	{
		int j,rc;
		rc=a[s];
		for(j=2*s;j<=m;j*=2)
		{
			if(j<m&&a[j]<a[j+1])
			j++;
			if(rc>=a[j])
			break;
			a[s]=a[j];
			s=j;
		}
		a[s]=rc;
	}
	public void print()
	{
		for(int i=10/2;i>=1;i--)
		heapsort(i,10);
		for(int i=10;i>1;i--)  
        {  
            int temp=a[i];  
            a[i]=a[1];  
            a[1]=temp;  
            heapsort(1,i-1);  
        }  
		System.out.println("堆排序");
		for(int i=1;i<11;i++)
		{
			System.out.print(a[i]);
			System.out.print(' ');
		}
		System.out.print("\n");
	}
}
public class sort {
	public static void main(String args[])
	{
		int[] num=new int[11];
		Scanner scanner=new Scanner(System.in);
		for(int i=1;i<11;i++)
		{
			num[i]=scanner.nextInt();
		}
		scanner.close();
		InsertSort q1=new InsertSort();
		q1.init(num);
		q1.insertsort();
		ShellSort q2=new ShellSort();
		q2.init(num);
		q2.shellsort();
		QuitSort q3=new QuitSort();
		q3.init(num);
		q3.quitsort(1,10);
		q3.print();
		MergeSort q4=new MergeSort();
		q4.init(num);
		q4.mergesort(1,10);
		q4.print();
		HeapSort q5=new HeapSort();
		q5.init(num);
		q5.print();
	}
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值