import java.util.Scanner;
public class Main {
static Scanner in =new Scanner(System.in);
static final int N=1000;
static int k;
//桶排序:快速,时间复杂度小,可以用来去重(数量较小时),但是有局限,不能排序小数,不能排序结构体
static void bool_sort(int[] a){
int[] bool=new int[N];
for (int i = 0; i < bool.length; i++)
bool[i]=0;
for (int i = 0; i <k; i++) {
bool[a[i]]++;
}
for (int i = 0; i < bool.length; i++) {
for (int j = 0; j<bool[i]; j++) {
System.out.print(i+" ");
}
}
System.out.println();
}
//冒泡排序,时间复杂度和初始序列有关
static void bubble_sort(int[] a){
int t=0;
boolean flag=true;//用来判断若一趟过程中没有交换则直接退出循环即可
for (int i = 0; i < k&&flag; i++) {
for (int j = 0; j <k-i-1; j++) {
flag=false;
if(a[j]>a[j+1]){
flag=true;
t=a[j];
a[j]=a[j+1];
a[j+1]=t;
}
}
}
for (int i = 0; i < a.length; i++) {
System.out.print(a[i]+" ");
}
System.out.println();
}
//选择排序(求解最值得时候一定要记得更新)
static void chose_sort(int[] a){
int min=0,pos=0,t=0;
for (int i = 0; i <k-1; i++) {
min=a[i];
pos=i;
for (int j = i; j <k; j++) {
if(a[j]<min){
min=a[j];
pos=j;
}
}
//将最小值和最前面一位交换
t=a[pos];a[pos]=a[i];a[i]=t;
}
for (int i = 0; i < a.length; i++) {
System.out.print(a[i]+" ");
}
System.out.println();
}
//快速排序
static void quick_sort(int[] a,int left,int right){
if(left>right)//数组索引出界排除
return;
int i,j,t,temp;
i=left;
j=right;
temp=a[left];
while(i!=j){
while(a[j]>=temp&&i<j)
j--;
while(a[i]<=temp&&i<j)
i++;
if(i<j){
t=a[j];
a[j]=a[i];
a[i]=t;
}
}
a[left]=a[i];
a[i]=temp;
quick_sort(a, left, i-1);
quick_sort(a, i+1, right);
}
public static void main(String[] args) {
while(in.hasNext()){
k=in.nextInt();
int[] a=new int[k];
for (int i = 0; i < k; i++)
a[i]=in.nextInt();
System.out.println("桶排序:");
bool_sort(a);
System.out.println("冒泡排序:");
bubble_sort(a);
System.out.println("快速排序:");
quick_sort(a,0,k-1);
for (int i = 0; i < a.length; i++)
System.out.print(a[i]+" ");
System.out.println();
System.out.println("选择排序:");
chose_sort(a);
}
}
}
此处我再附上我写的直接插入排序和归并排序算法的链接:http://blog.csdn.net/jinglelia/article/details/77004542