1. 程式人生 > >java排序演算法(你必須會的常見排序演算法)

java排序演算法(你必須會的常見排序演算法)

1、排序演算法說明

1、排序的定義
對一序列物件根據某個關鍵字進行排序
2、術語說明

  • 穩定:如果a原本在b前面,而a=b,排序之後a仍然在b的前面;
  • 不穩定:如果a原本在b的前面,而a=b,排序之後a可能會出現在b的後面;
  • 內排序:所有排序操作都在記憶體中完成;
  • 外排序:由於資料太大,因此把資料放在磁碟中,而排序通過磁碟和記憶體的資料傳輸才能進行;
  • 時間複雜度: 一個演算法執行所耗費的時間。
  • 空間複雜度:執行完一個程式所需記憶體的大小
    3、 演算法總結
    在這裡插入圖片描述
    4、演算法分類
    在這裡插入圖片描述

二、常見演算法得實現程式碼

1.氣泡排序

package test.allSort;

import java.util.Arrays;

/**
 * @author Mrqian
 * @time  2018-12-25
 * 氣泡排序
 * */
public class MaoPao {

	public static void main(String[] args) {
	  int [] arr= {1,5,8,2,7,257,853,7,357,537,687,36,73,47};
	  maopao(arr);
	  System.out.println(Arrays.toString(arr));
	}
	public static void maopao(int [] arr) {
		for(int i=0;i<arr.length;i++) {
			for(int j=0;j<arr.length-i-1;j++) {
				if(arr[j]>arr[j+1]) {
					int temp=arr[j];
					arr[j]=arr[j+1];
					arr[j+1]=temp;
				}
			}
		}
	}
}

2、選擇排序

package test.allSort;

import java.util.Arrays;

/**
 * @author Mrqian
 * @time  2018-12-25
 * 選擇排序
 * */
public class ChooseSort {

	public static void main(String[] args) {
		int [] arr= {1,5,8,2,7,257,853,7,357,537,687,36,73,47};
		  choose(arr);
		  System.out.println(Arrays.toString(arr));

	}
	public static void choose(int [] arr) {
		for(int i=0;i<arr.length;i++) {
			for(int j=i;j<arr.length;j++) {
				if(arr[i]>arr[j]) {
				int temp=arr[i];
				arr[i]=arr[j];
				arr[j]=temp;
				}
			}
		}
	}

}

3、插入排序

package test.allSort;

import java.util.Arrays;

/**
 * @author Mrqian
 * @time  2018-12-25
 * 插入排序
 * */
public class InsertSort {
     public static void main(String[] args) {
    	 int [] arr= {1,5,8,2,7,257,853,7,357,537,687,36,73,47};
   	  insertSort(arr);
   	  System.out.println(Arrays.toString(arr));
	}
     public static void insertSort(int [] arr) {
    	 for(int i=1;i<arr.length;i++) {
    		 int temp=arr[i];
    		 int j=i-1;
    		 while(arr[j]>temp&&j>=0) {
    			 arr[i]=arr[j];
    			 j--;
    		 }
    		 arr[j+1]=temp;
    	 }
     }
}

4、二分查詢法

package test.allSort;

/**
 * @author Mrqian
 * @time  2018-12-25
 * 二分查詢法
 * */
public class BinarySerach {
   public static void main(String[] args) {
	   int [] arr= {1,5,8,2,7,257,853,7,357,537,687,36,73,47};
	  String result= binary(arr, 5);
	   System.out.println(result);
    }
   
   public static String binary(int [] arr,int a) {
	   choose(arr);
	   int first=0;
	   int last=arr.length-1;
	   int mid;
	   while(first<=last) {
		   mid=(first+last)/2;
		   if(arr[mid]==a) {
			   return "找到該元素"+a;
		   }else if(arr[mid]>a) {
			   last=mid-1;
		   }else {
			   first=mid+1;
		   }
	   }
	return "沒找到該元素"+a;
   }
	public static void choose(int [] arr) {
		for(int i=0;i<arr.length;i++) {
			for(int j=i;j<arr.length;j++) {
				if(arr[i]>arr[j]) {
				int temp=arr[i];
				arr[i]=arr[j];
				arr[j]=temp;
				}
			}
		}
	}
}

5、快速排序

package test.allSort;

import java.util.Arrays;
/**
 * @author Mrqian
 * @time  2018-12-25
 * 快速排序
 * */
public class QUickSort {
   public static void main(String[] args) {
	  int [] arr= {1,5,8,2,7,257,853,7,357,537,687,36,73,47};
	  kspx(arr, 0, arr.length-1);
	  System.out.println(Arrays.toString(arr));
    }
   public static int quickSort(int [] arr,int left, int right) {
	   int key=arr[left];
	   while(left<right) {
		   while(key<=arr[right]&&left<right) {
			   right--;
		   }
		   arr[left]=arr[right];
		   while(key>=arr[left]&&left<right) {
			   left++;
		   }
		   arr[right]=arr[left];
	   }
	   arr[left]=key;
	   return left;
   }
   
   public static void kspx(int [] arr,int left,int right) {
	   if(left<right) {
		   int index=quickSort(arr, left, right);
		   kspx(arr, left, index);
		   kspx(arr, index+1, right);
	   }
   }
   
}

6、歸併排序

package test.allSort;

import java.util.Arrays;

/**
 * @author Mrqian
 * @time  2018-12-25
 * 歸併排序
 * */
public class MergeSort {

	public static void main(String[] args) {
		  int [] arr= {1,5,8,2,7,257,853,7,357,537,687,36,73,47};
		  int [] newarr=new int[arr.length];
		  guibing(arr, 0, arr.length-1, newarr);
		  System.out.println(Arrays.toString(arr));

	}
	public static void guibing(int [] arr,int left, int right,int [] newarr) {
		if(left<right) {
		    int mid=(left+right)/2;
			guibing(arr, left, mid, newarr);
			guibing(arr, mid+1, right, newarr);
			merge(arr, left, mid, right, newarr);
			
		}
	}
	public static void merge(int [] arr,int left, int mid,int right,int [] newarr) {
		int m=left;int x=mid;
		int n=mid+1;int y=right;
		int index=0;
		while(m<=x&&n<=y) {
			if(arr[m]<arr[n]) {
				newarr[index++]=arr[m++];
			}else {
				newarr[index++]=arr[n++];
			}
		}
		while(m<=x) {
			newarr[index++]=arr[m++];
		}
		while(n<=y) {
			newarr[index++]=arr[n++];
		}
		for(int i=0;i<index;i++) {
			arr[i+left]=newarr[i];
		}
	}

}