排序算法
目录
- 选择排序
- 插入排序
- 冒泡排序
- 归并排序
- 快速排序
- 希尔排序
- 堆排序
- 计数排序
- 桶排序
- 基数排序
1.SelectRanking原理
SelectRanking-java代码
public class SelectRanking { public static void select(int[] a){ int i,j; int tmp = 0, flag = 0; int n = a.length; for(i=0;i<n;i++){ tmp = a[i]; flag = i; for(j=i+1;j<n;j++){ if(a[j]<tmp){ tmp = a[j]; flag = j; } } if(flag!=i){ a[flag] = a[i]; a[i] = tmp; } } } public static void main(String[] args){ int a[] = {1,7,7,8,4,4,5,8,0,8,3}; for(int i=0;i<a.length;i++){ System.out.print(a[i]+" "); } System.out.println("\n选择排序:"); select(a); for(int i=0;i<a.length;i++){ System.out.print(a[i]+" "); } System.out.println("\n"); System.out.println("请输入几个数并用逗号隔开:"); Scanner sc = new Scanner(System.in); String str = sc.next().toString(); String[] arr = str.split(","); int[] b = new int[arr.length]; for(int i=0;i<b.length;i++){ b[i] = Integer.parseInt(arr[i]); System.out.print(b[i]+" "); } System.out.println("\n"); } }
2.InsertRanking原理
InsertRanking-java代码
public class InsertRanking {
public static void Insert(int[] a){
if(a!=null){
for(int i=1;i<a.length;i++){
int tmp=a[i],j=i;
if(a[j-1]>tmp){
while(j>=1&&a[j-1]>tmp){
a[j]=a[j-1];
j--;
}
}
a[j]=tmp;
}
}
}
public static void main(String[] args){
int a[] = {1,7,9,8,4,4,5,8,0,8,3};
for(int i=0;i<a.length;i++){
System.out.print(a[i]+" ");
}
System.out.println("\n插入排序:");
Insert(a);
for(int i=0;i<a.length;i++){
System.out.print(a[i]+" ");
}
}
}
3.BubbleRanking原理
BubbleRanking-java代码
public class BubbleRanking {
public static void Bubble(int[] a){
int i,j;
int tmp;
for(i=0;i<(a.length-1);i++){
for(j=(a.length-1);j>i;--j){
if(a[j]<a[j-1]){
tmp = a[j];
a[j] = a[j-1];
a[j-1] = tmp;
}
}
}
}
public static void main(String[] args){
int a[] = {1,7,7,8,4,4,5,8,0,8,3};
for(int i=0;i<a.length;i++){
System.out.print(a[i]+" ");
}
System.out.println("\n冒泡排序:");
Bubble(a);
for(int i=0;i<a.length;i++){
System.out.print(a[i]+" ");
}
}
}
4.MergeRanking原理
MergeRanking-java代码
public class MergeRanking {
public static void main(String [] args){
Scanner in=new Scanner(System.in);
System.out.println("请输入数组的大小");
int N=in.nextInt();//从键盘读取数组的大小。
int A[]=new int [N];
System.out.println("请输入数组中的数");
for(int i=0;i<N;i++){//一次从键盘中读取输入的数。
A[i]=in.nextInt();
}
mergeSort(A,0,N-1);//调用归并函数。
System.out.println("按从小到大的顺序归并排序后为:");
for(int m=0;m<N;m++){
System.out.print(A[m]+" ");
}
}
public static void mergeSort(int A[],int p,int r){//归并函数的代码。
if(p<r){
int q=(p+r)/2;
mergeSort(A,p,q);
mergeSort(A,q+1,r);
merge(A,p,q,r);
}
}
public static void merge(int A[],int p,int q,int r){//将两个有序的数组进行归并的代码。
int L[]=new int[q-p+1];
int R[]=new int[r-q];
int k,j;
for( k=0;k<=q-p;k++){
L[k]=A[p+k];
}
for(j=0;j<r-q;j++){
R[j]=A[q+1+j];
}/*将A数组从A[p]到A[r]经A[q]划分成两部分并存储在两个新数组中.
由于在mergeSort函数中经递归到最底层时只剩下由两个长度为1的数组数,所以这两个数组必然有序,
所以往回调用时A[p~q]和A[q+1~r]也必然是两个有序的数组。*/
k=0;
j=0;
for(int i=p;i<=r;i++){/*将两个数组比较大小往A[]中添加时还要分成两个部分添加。因为k和j总是在不定期的加1,而且A[]比两个数组都要大
所以要识别两个小数组是否越界*/
if(k<=q-p&&j<=r-q-1){//第一个部分:非越界部分怎样添加。
if(L[k]<R[j]){
A[i]=L[k];
k++;
}
else {
A[i]=R[j];
j++;
}
}
else{//第二部分:其中某个数组越界后,另一个数组中未添加的数一定比A[]中已经添加的数要大且有序,所以直接往后添加。
if(k>q-p){//L[]先越界,直接往A[]后添加R[]没有添加的部分。
A[i]=R[j];
j++;
}
else{//R[]先越界,直接往A[]后添加L[]没有添加的部分。
A[i]=L[k];
k++;
}
}
}
}
}
5.quickranking原理
quickranking-java代码
public class quickranking {
public static void sort(int array[],int low,int high){
int i,j;
int index;
if(low>=high)
return;
i=low;
j=high;
index=array[i];
while(i<j){
while(i<j&&array[j]>=index)
j--;
if(i<j){
array[i]=array[j];
i++;
}
while(i<j&&array[i]<index)
i++;
if(i<j)
array[j--]=array[i];
}
array[i]=index;
sort(array,low,i-1);
sort(array,i+1,high);
}
public static void quickSort(int array[]){
sort(array,0,array.length-1);
}
public static void main(String[] args){
Scanner in=new Scanner(System.in);
System.out.println("请输入数组的大小");
int N=in.nextInt();//从键盘读取数组的大小。
int A[]=new int [N];
System.out.println("请输入数组中的数");
for(int i=0;i<N;i++){//一次从键盘中读取输入的数。
A[i]=in.nextInt();
}
quickSort(A);
System.out.println("按从小到大排序后为:");
for(int m=0;m<N;m++){
System.out.print(A[m]+" ");
}
}
}
6.shellranking原理
shellranking-Java代码
public class shellranking {
public static void main(String[] args){
Scanner in=new Scanner(System.in);
System.out.println("请输入数组的大小");
int N=in.nextInt();//从键盘读取数组的大小。
int A[]=new int [N];
System.out.println("请输入数组中的数");
for(int i=0;i<N;i++){//一次从键盘中读取输入的数。
A[i]=in.nextInt();
}
shellSort(A);
System.out.println("按从小到大排序后为:");
for(int m=0;m<N;m++){
System.out.print(A[m]+" ");
}
}
public static void shellSort(int array[]){
int length = array.length;
int i,j,h,tmp;
for(h=length/2;h>0;h=h/2){
for(i=h;i<length;i++){
tmp = array[i];
for(j=i-h;j>=0;j-=h){
if(tmp<array[j]){
array[j+h] = array[j];
}
else
break;
}
array[j+h] = tmp;
}
}
}
}
7.heapranking原理
heapranking-Java代码
public class heapranking {
public static void main(String[] args){
Scanner in=new Scanner(System.in);
System.out.println("请输入数组的大小");
int N=in.nextInt();//从键盘读取数组的大小。
double A[]=new double [N];
System.out.println("请输入数组中的数");
for(int i=0;i<N;i++){//一次从键盘中读取输入的数。
A[i]=in.nextDouble();
}
//a sample input
System.out.println("Input: " + Arrays.toString(A));
heapranking maxhp = new heapranking();
maxhp.heapsort(A);
System.out.println("Output: " + Arrays.toString(A));
}
protected double A[];
protected int heapsize;
protected int parent(int i) {return (i - 1) / 2;}
protected int left(int i) {return 2 * i + 1;}
protected int right(int i) {return 2 * i + 2;}
//constructors
public heapranking(){}
public heapranking(double A[]){
buildMaxHeap(A);
}
protected void maxHeapify(int i){
int l = left(i);
int r = right(i);
int largest = i;
if (l <= heapsize - 1 && A[l] > A[i])
largest = l;
if (r <= heapsize - 1 && A[r] > A[largest])
largest = r;
if (largest != i) {
double temp = A[i];
// swap
A[i] = A[largest];
A[largest] = temp;
this.maxHeapify(largest);
}
}
public void buildMaxHeap(double [] A){
this.A = A;
this.heapsize = A.length;
for (int i = parent(heapsize - 1); i >= 0; i--)
maxHeapify(i);
}
public void heapsort(double [] A){
buildMaxHeap(A);
// int step = 1;
for (int i = A.length - 1; i > 0; i--) {
double temp = A[i];
A[i] = A[0];
A[0] = temp;
heapsize--;
// System.out.println("Step: " + (step++) + Arrays.toString(A));
maxHeapify(0);
}
}
}
8.计数排序
countranking原理
countranking-Java代码
import java.util.*; public class countranking { public static int[] countSort(int[] array) { if (array.length == 0) return array; int bias, min = array[0], max = array[0]; for (int i = 1; i < array.length; i++) { if (array[i] > max) max = array[i]; if (array[i] < min) min = array[i]; } bias = 0 - min; int[] bucket = new int[max - min + 1]; Arrays.fill(bucket, 0); for (int i = 0; i < array.length; i++) { bucket[array[i] + bias]++; } int index = 0, i = 0; while (index < array.length) { if (bucket[i] != 0) { array[index] = i - bias; bucket[i]--; index++; } else i++; } return array; } public static void main(String[] args) throws Exception{ Scanner in=new Scanner(System.in); System.out.println("请输入数组的大小"); int N=in.nextInt();//从键盘读取数组的大小。 int A[]=new int [N]; System.out.println("请输入数组中的数"); for(int i=0;i<N;i++){//一次从键盘中读取输入的数。 A[i]=in.nextInt(); } countSort(A); for(int m=0;m<N;m++){ System.out.print(A[m]+" "); } } }
9.桶排序
bucketranking原理
bucketranking-Java代码
public class bucketranking { public static void bucketSort(int[] arr){ int max = Integer.MIN_VALUE; int min = Integer.MAX_VALUE; for(int i = 0; i < arr.length; i++){ max = Math.max(max, arr[i]); min = Math.min(min, arr[i]); } //桶数 int bucketNum = (max - min) / arr.length + 1; ArrayList<ArrayList<Integer>> bucketArr = new ArrayList<>(bucketNum); for(int i = 0; i < bucketNum; i++){ bucketArr.add(new ArrayList<Integer>()); } //将每个元素放入桶 for(int i = 0; i < arr.length; i++){ int num = (arr[i] - min) / (arr.length); bucketArr.get(num).add(arr[i]); } //对每个桶进行排序 for(int i = 0; i < bucketArr.size(); i++){ Collections.sort(bucketArr.get(i)); } for (int i = 0; i < bucketArr.size(); i++){ for (int j = 0; j < bucketArr.get(i).size();j++){ System.out.print(bucketArr.get(i).get(j).toString()+" "); } } // System.out.println(bucketArr.toString()); } public static void main(String[] args){ Scanner in=new Scanner(System.in); System.out.println("请输入数组的大小"); int N=in.nextInt();//从键盘读取数组的大小。 int A[]=new int [N]; System.out.println("请输入数组中的数"); for(int i=0;i<N;i++){//一次从键盘中读取输入的数。 A[i]=in.nextInt(); } bucketSort(A); } }
10.基数排序
radixranking原理
radixranking-Java代码
import java.util.*; public class radixranking { public static void radixSort(int[] a){ sort(a); for(int i=0;i<a.length;i++){ System.out.print(a[i]+" "); } } public static void sort(int[] array){ //首先确定排序的趟数; int max=array[0]; for(int i=1;i<array.length;i++){ if(array[i]>max){ max=array[i]; } } int time=0; //判断位数; while(max>0){ max/=10; time++; } //建立 10 个队列; List<ArrayList> queue=new ArrayList<ArrayList>(); for(int i=0;i<10;i++){ ArrayList<Integer>queue1=new ArrayList<Integer>(); queue.add(queue1); } //进行 time 次分配和收集; for(int i=0;i<time;i++){ //分配数组元素; for(int j=0;j<array.length;j++){ //得到数字的第 time+1 位数; int x=array[j]%(int)Math.pow(10,i+1)/(int)Math.pow(10, i); ArrayList<Integer>queue2=queue.get(x); queue2.add(array[j]); queue.set(x, queue2); } int count=0;//元素计数器; //收集队列元素; for(int k=0;k<10;k++){ while(queue.get(k).size()>0){ ArrayList<Integer>queue3=queue.get(k); array[count]=queue3.get(0); queue3.remove(0); count++; } } } } public static void main(String[] args){ Scanner in=new Scanner(System.in); System.out.println("请输入数组的大小"); int N=in.nextInt();//从键盘读取数组的大小。 int A[]=new int [N]; System.out.println("请输入数组中的数"); for(int i=0;i<N;i++){//一次从键盘中读取输入的数。 A[i]=in.nextInt(); } radixSort(A); } }