Java实现八大排序
package com.buledot.sort;
import java.io.IOException;
import java.util.Arrays;
import java.util.Scanner;
public class Sort {
@SuppressWarnings("resource")
public static void main(String[] args) {
int a[]= {65,34,25,87,12,38,56,46,14,77,92,23};
Scanner input = new Scanner(System.in);
int n = a.length;
while(true) {
System.out.println("数组长度: "+n);
System.out.print("排序前:");
print(a);
System.out.println("1、直接插入排序"+"\t"+"5、冒泡排序");
System.out.println("2、希尔排序"+"\t\t"+"6、快速排序");
System.out.println("3、选择排序"+"\t\t"+"7、归并排序");
System.out.println("4、堆排序"+"\t\t"+"8、基数排序");
System.out.print("请选择:");
int choice = input.nextInt();
switch(choice) {
case 1:
InsertSort(a,n); //直接插入排序
break;
case 2:
ShellSort(a); //希尔排序
break;
case 3:
SelectSort(a,n); //选择排序
break;
case 4:
HeapSort(a,n); //堆排序
break;
case 5:
BubbleSort(a,n); //冒泡排序
break;
case 6:
QuickSort(a,0,n-1); //快速排序
break;
case 7:
sort(a, 0, n-1); //归并排序
break;
case 8:
RadixSort(a,n); //基数排序
break;
}
System.out.print("排序后:");
print(a);
System.out.println();
try {
System.in.read();
} catch (IOException e) {
e.printStackTrace();
}
}
}
public static void print(int []a) {
for(int i = 0;i<a.length;i++) {
System.out.print(a[i]+" ");
}
System.out.println("\n");
}
//显示每一趟过程
public static void process(int []a,int k) {
System.out.println("第"+k+"躺:"+Arrays.toString(a));
}
//1、直接插入排序
public static void InsertSort(int []a,int n)
{
int i,j,k=1;
int temp;
for(i=0;i<n-1;i++)
{
temp=a[i+1]; //下一个数据元素为temp
j=i; //位置
while(j>-1&&temp<a[j]) //与a[i+1]前的数据元素比较
{
a[j+1]=a[j]; //交换位置
j--; //下标前移
}
a[j+1]=temp; //赋值存入插入的数据元素
process(a,k++);
}
}
//2、希尔排序
public static void ShellSort(int []a)
{
int span=a.length/2;
int x,j,k=1;
while(span>=1) {
for(int i = 0;i<a.length;i++) {
x = a[i];
j = i-span;
while(j>-1&&x <= a[j])
{
a[j+span] = a[j];
j = j-span;
}
a[j+span] = x;
}
span=span/2;
process(a,k++);
}
}
//3、选择排序
public static void SelectSort(int []a,int n)
{
int i,j,small,k=1;
int temp;
for(i=0;i<n-1;i++)
{
small=i; //设第i个数据元素最小
for(j=i+1;j<n;j++) //寻找最小的数据元素
if(a[j]<a[small])
small=j; //记住最小的数据元素的下标
if(small!=i) //当最小下标不等于i时交换
{
temp=a[i];
a[i]=a[small];
a[small]=temp;
}
process(a,k++);
}
}
//4、堆排序
//创建堆
public static void CreatHeap(int []a,int n,int h)
{
int i,j,flag;
int temp;
i=h; //i为要创建堆的二叉树的根节点的下标
j=2*i+1; //j为i的左孩子结点的下标
temp=a[i];
flag=0;
//沿左右孩子中值较大者重复向下筛选
while(j<n&&flag!=1)
{
//寻找左右孩子结点中较大者,j为其下标
if(j<n-1&&a[j]<a[j+1])
j++;
if(temp>a[j]) //a[i]<a[j]
flag=1; //标志筛选结束条件
else //否则把a[j]上移
{
a[i]=a[j];
i=j;
j=2*i+1;
}
}
a[i]=temp; //把最初的a[i]赋值给a[j]
}
//初始化创建最大堆
public static void InitCreatHeap(int []a,int n)
{
int i;
for(i=(n-2)/2;i>=0;i--)
CreatHeap(a,n,i);
}
//堆排序算法
public static void HeapSort(int []a,int n)
{
int i,k=1;
int temp;
InitCreatHeap(a,n); //初始化创建最大堆
for(i=n-1;i>0;i--) //当前最大堆个数每次递减1
{
//把堆顶的数据元素与最大堆的最后一个数据元素交换
temp=a[0];
a[0]=a[i];
a[i]=temp;
CreatHeap(a,i,0); //调整根节点满足最大堆
process(a,k++);
}
}
//5、冒泡排序
public static void BubbleSort(int []a,int n)
{
int i,j,flag=1,k=1;
int temp;
for(i=1;i<n&&flag==1;i++)
{
flag=0;
for(j=0;j<n-i;j++)
{
if(a[j]>a[j+1]) //交换数据元素
{
flag=1;
temp=a[j];
a[j]=a[j+1];
a[j+1]=temp;
}
}
process(a,k++);
}
}
//6、快速排序
public static void QuickSort(int []a,int low,int high)
{
int i=low,j=high;
int temp=a[low]; //取第一个数据元素为标准元素
while(i<j)
{
while(i<j&&temp<=a[j]) //数组右端扫描
j--;
if(i<j)
{
a[i]=a[j]; //右端小的前移
i++;
}
while(i<j&&a[i]<temp) //数组左端扫描
i++;
if(i<j)
{
a[j]=a[i]; //左端大的后移
j--;
}
}
a[i]=temp; //找到temp的准确位置
if(low<i)
QuickSort(a,low,i-1); //对左端子集合进行递归
if(i<high)
QuickSort(a,i+1,high); //对右端子集合进行递归
}
//7、归并排序
public static void sort(int[] a,int low,int high){
int mid = (low+high)/2;
if(low<high){
// 递归实现归并排序
sort(a,low,mid);
sort(a,mid+1,high);
//左右归并
MergeSort(a,low,mid,high);
}
}
//将两个有序序列归并为一个有序序列(二路归并)
public static void MergeSort(int[] a, int low,int mid, int high) {
// 定义一个临时数组,用来存储排序后的结果
int[] temp = new int[high-low+1];
int i= low;
int j = mid+1;
int k=0;
// 把较小的数先移到新数组中
while(i<=mid && j<=high){
if(a[i]<a[j]){
temp[k++] = a[i++];
}else{
temp[k++] = a[j++];
}
}
// 把左边剩余的数移入数组
while(i<=mid){
temp[k++] = a[i++];
}
// 把右边边剩余的数移入数组
while(j<=high){
temp[k++] = a[j++];
}
// 把新数组中的数覆盖nums数组
for(int x=0;x<temp.length;x++){
a[x+low] = temp[x];
}
}
//8、基数排序
public static void RadixSort(int[] array,int d)
{
int n=1;//代表位数对应的数:1,10,100...
int k=0;//保存每一位排序后的结果用于下一位的排序输入
int length=array.length;
int [][]bucket=new int[10][length];//排序桶用于保存每次排序后的结果,这一位上排序结果相同的数字放在同一个桶里
int []order=new int[length];//用于保存每个桶里有多少个数字
while(n<d)
{
for(int num:array) //将数组array里的每个数字放在相应的桶里
{
int digit=(num/n)%10;
bucket[digit][order[digit]]=num;
order[digit]++;
}
for(int i=0;i<length;i++)//将前一个循环生成的桶里的数据覆盖到原数组中用于保存这一位的排序结果
{
if(order[i]!=0)//这个桶里有数据,从上到下遍历这个桶并将数据保存到原数组中
{
for(int j=0;j<order[i];j++)
{
array[k]=bucket[i][j];
k++;
}
}
order[i]=0;//将桶里计数器置0,用于下一次位排序
}
n*=10;
k=0;//将k置0,用于下一轮保存位排序结果
}
}
}