1. 程式人生 > >JAVA中排序演算法

JAVA中排序演算法

一晚上終於寫完了,初學者

插入排序:

import java.util.Scanner;



public class Charupaixu {
public static void insertSort(int[] a){//傳遞一個數組
int length=a.length;//陣列長度將這個提取出來是為了提高速度
int insertNum;//要插入的數
for(int i=0;i<length;i++){//插入的次數
insertNum=a[i];//要插入的數
int j=i-1;//已經排好的序列元素個數
while(j>=0&&a[j]>insertNum){//序列從後到前迴圈將大於insertNum的數想後移動
a[j+1]=a[j];//元素移動一格
j--;
}
a[j+1]=insertNum;//將需要插入的數放在要插入的位置
}

}
public static void main(String[] args) {
// TODO Auto-generated method stub
System.out.println("請輸入四個數字進行排序");
Scanner in=new Scanner(System.in);
int[] s=new int[4];
for(int i=0;i<s.length;i++){
s[i]=in.nextInt();
}
insertSort(s);
for(int j=0;j<s.length;j++){
System.out.print(s[j]+"\t");
}
}


}

堆排序:程式碼中有見解

import java.util.Arrays;
import java.util.Scanner;


public class Duipaixu {
/**
 * 將序列建成大頂堆即該完全二叉樹中每一個節點的值均大於或等於他的兩個子節點的值
 * 將根節點與最後一個節點交換,然後斷開最後一個節點
 * 重複第一二部直到斷開所有節點
 * @param args
 */
public static void heapSort(int[] a){
System.out.println("開始排序");
int arrayLength=a.length;//迴圈建堆
for(int i=0;i<arrayLength-1;i++){//建堆
buildMaxHeap(a,arrayLength-1-i);
swap(a,0,arrayLength-1-i);//交換堆定和最後一個元素
System.out.println(Arrays.toString(a));
}
}
private static void swap(int[] data,int i,int j){
int tmp=data[i];
data[i]=data[j];
data[j]=tmp;
}
private static void buildMaxHeap(int[] data,int lastIndex){
//對data陣列從0到lastIndex間大頂堆
//從lastIndex處節點(最後一個節點)的父節點開始
for(int i=(lastIndex-1)/2;i>=0;i++){
//k儲存正在判斷的節點
int k=i;
//如果當前k節點的子節點存在
while(k*2+1<=lastIndex){
int biggerIndex=2*k+1;//k節點的左子節點的索引
//如果biggerIndex小於lastIndex,即biggerIndex+1代表的K節點的右子節點存在
if(biggerIndex<lastIndex){
if(data[biggerIndex]<data[biggerIndex+1]){//如果右子節點的值較大
biggerIndex++;//biggerIndex總是記錄較大節點的索引
}
}
//如果k節點的值小於較大的子節點的值
if(data[k]<data[biggerIndex]){
swap(data,k,biggerIndex);//交換他們
//將biggerIndex賦予k開始while迴圈的下一次迴圈,重新保證k節點的值大於左右子節點的值
k=biggerIndex;
}else{
break;
}
}
}
}
public static void main(String[] args)throws Exception {
// TODO Auto-generated method stub
System.out.println("請輸入四個數字進行排序");
Scanner in=new Scanner(System.in);
int[] s=new int[4];
for(int i=0;i<s.length;i++){
s[i]=in.nextInt();
}
heapSort(s);
for(int j=0;j<s.length;j++){
System.out.print(s[j]+" ");
}
}


}

歸併排序:

import java.util.Scanner;


public class Guibingpaixu {
/**
 * 選擇相鄰的兩個書組成一個有序序列
 * 選擇相鄰的兩個有序序列組成一個有序的序列
 * 重複第二步直到全部組成一個有序序列
 * @param args
 */
public static void mergeSort(int[] number,int left,int right){
int t=1;//每組元素個數
int size=right-left+1;
while(t<size){
int s=t;//本次迴圈每組元素個數
t=2*s;
int i=left;
while(i+(t-1)<size){
merge(number,i,i+(s-1),i+(t-1));
i+=t;
}
if(i+(s-1)<right)
merge(number,i,i+(s-1),right);
}
}
private static void merge(int[] data,int p,int q,int r){
int[] B=new int[data.length];
int s=p;
int t=q+1;
int k=p;
while(s<=q&&t<=r){
if(data[s]<=data[t]){
B[k]=data[s];
s++;
}else{
B[k]=data[t];
t++;
}
k++;
}
if(s==q+1)
B[k++]=data[t++];
else
B[k++]=data[s++];
for(int i=p;i<=r;i++)
data[i]=B[i];
}

public static void main(String[] args) {
// TODO Auto-generated method stub
System.out.println("請輸入四個數字進行排序");
Scanner in=new Scanner(System.in);
int[] s=new int[6];
for(int i=0;i<s.length;i++){
s[i]=in.nextInt();
}
mergeSort(s,0,5);
for(int j=0;j<s.length;j++){
System.out.print(s[j]+" ");
}
}


}
基數排序:

import java.util.ArrayList;
import java.util.Scanner;


public class Jishupaixu {
/**
 * 將所有的數的各位取出按照個位數進行排序,構成一個序列
 * 將心構成的所有的數的十位取出按照十位數進行排序構成一個序列
 * @param args
 */
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++;
}
ArrayList<ArrayList> queue=new ArrayList<ArrayList>();//建立10個佇列
for(int i=0;i<10;i++){
ArrayList<Integer> queuel=new ArrayList<Integer>();
queue.add(queuel);
}
for(int i=0;i<time;i++){//進行time次分配和收集
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) {
// TODO Auto-generated method stub
System.out.println("請輸入四個數字進行排序");
Scanner in=new Scanner(System.in);
int[] s=new int[4];
for(int i=0;i<s.length;i++){
s[i]=in.nextInt();
}
sort(s);
for(int j=0;j<s.length;j++){
System.out.print(s[j]+" ");
}
}


}
快速排序:

import java.util.Scanner;


public class Kuaipai {
/**
 * 選擇第一個數最為p小於p的數放在左邊,大於P的數放在右邊
 * 遞迴的將p左邊後右邊的數按照第一步進行直到不能遞迴
 * @param args
 */
public static void quickSort(int[] number,int start,int end){
if(start<end){
int base=number[start];//選定第一個值作為基準值
int temp;//臨時中間值
int i=start,j=end;
do{
while((number[i]<base)&&(i<end))
i++;
while((number[j]>base)&&(j>start))
j--;
if(i<=j){
temp=number[i];
number[i]=number[j];
number[j]=temp;
i++;
j--;
}
}while(i<=j);
if(start<j)
quickSort(number,start,j);
if(end>j)
quickSort(number,i,end);

}
}
public static void main(String[] args) {
// TODO Auto-generated method stub
System.out.println("請輸入六個數字進行排序");
Scanner in=new Scanner(System.in);
int[] s=new int[6];
for(int i=0;i<s.length;i++){
s[i]=in.nextInt();
}
quickSort(s,0,5);
for(int j=0;j<s.length;j++){
System.out.print(s[j]+" ");
}
}


}
氣泡排序:

import java.util.Scanner;


public class Maopaopaixu {
/**
 * 將序列中所有元素亮亮比較將最大的放在最後面
 * 將剩餘的序列中所有元素兩兩比較將最大的放在最後面
 * 重複第二步直到只剩下一個數
 * @param args
 */
public static void bubbleSort(int[] a){
int length=a.length;
int temp;
for(int i=0;i<length;i++){
for(int j=0;j<length-1;j++){
if(a[i]>a[j]){
temp=a[i];
a[i]=a[j];
a[j]=temp;
}
}
}
}
public static void main(String[] args) {
// TODO Auto-generated method stub
System.out.println("請輸入四個數字進行排序");
Scanner in=new Scanner(System.in);
int[] s=new int[4];
for(int i=0;i<s.length;i++){
s[i]=in.nextInt();
}
bubbleSort(s);
for(int j=0;j<s.length;j++){
System.out.print(s[j]+" ");
}
}


}
希爾排序:

import java.util.Scanner;


public class xierpaixu {
/**
 * 將數的個數設為N取奇數k=n/2將下標差值為k的數分為一組,構成有序序列
 * 比如5個數,K=2,即1和4一組,2和5一組這
 * 再去k=k/2將下標差值為k的數分為一組構成有序序列
 * 直到k=1執行簡單的插入排序
 * @param args
 */
public static void sheelSort(int[] a){
int d=a.length;
while(d!=0){
d=d/2;
for(int x=0;x<d;x++){//分的組數
for(int i=x+d;i<a.length;i+=d){//組中的元素從第二個數開始
int j=i-d;//j為有序序列最後一位的位數
int temp=a[i];//要插入的元素插入排序
for(;j>=0&&temp<a[j];j-=d){//從後往前遍歷
a[j+d]=a[j];//向後移動d位
}
a[j+d]=temp;
}
}
}
}
public static void main(String[] args) {
// TODO Auto-generated method stub
System.out.println("請輸入五個數字進行排序");
Scanner in=new Scanner(System.in);
int[] s=new int[5];
for(int i=0;i<s.length;i++){
s[i]=in.nextInt();
}
sheelSort(s);
for(int j=0;j<s.length;j++){
System.out.print(s[j]+" ");
}
}
}

選擇排序:

import java.util.Scanner;


public class xuanzepaixu {
/**
 * 遍歷真個序列將最小的數放在最前面
 * 遍歷剩下的序列將最小的數放在最前面
 * 直到剩下一個數
 * @param args
 */
public static void selectSort(int[] a){
int length=a.length;
for(int i=0;i<length;i++){//迴圈次數
int key=a[i];
int position=i;//位置
for(int j=i+1;j<length;j++){//選出最小的值和位置
if(a[j]<key){
key=a[j];
position=j;
}

}
a[position]=a[i];//交換位置
a[i]=key;
}
}


public static void main(String[] args) {
// TODO Auto-generated method stub
System.out.println("請輸入四個數字進行排序");
Scanner in=new Scanner(System.in);
int[] s=new int[4];
for(int i=0;i<s.length;i++){
s[i]=in.nextInt();
}
selectSort(s);
for(int j=0;j<s.length;j++){
System.out.print(s[j]+" ");
}
}
}