快速排序
原理
1.先从数据序列中选一个元素,并将序列中所有比该元素小的元素都放到它的右边或左边,再对左右两边分别用同样的方法处之直到每一个待处理的序列的长度为1,处理结束。
2. 快排有一个特别需要注意的点,就是快排应该先从右边查找需要找的数
代码实现
public static void main(String[] args) {
int[] arr = new int[]{1,4,6,2,8};
quick_sort(arr, 0, arr.length - 1);
for (int i = 0; i < arr.length; i++) {
System.out.println(arr[i]);
}
}
public static void quick_sort(int[] a, int left, int right) {
if (a == null || a.length == 0) return;
if (left > right) {
return;
}
int i = left;
int j = right;
int temp = a[left];
while (i != j) {
while (i < j && a[j] >= temp) {
j--;
}
while (i < j && a[i] <= temp) {
i++;
}
if (i < j) {
int m = a[i];
a[i] = a[j];
a[j] = m;
}
}
int n = a[i];
a[i] = a[left];
a[left] = n;
quick_sort(a, left, j - 1);
quick_sort(a, j + 1, right);
}
归并排序
原理
将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。
代码实现
public static void main(String[] args) {
int[] arr = {1, 4, 2, 7, 4};
sort(arr);
for (int i : arr) {
System.out.print(i + "\t");
}
}
public static void sort(int[] arr){
int[] tmp = new int[arr.length];
int left = 0 ;
int right = arr.length - 1 ;
sortMerge(arr , left , right , tmp);
}
public static void sortMerge(int[] arr,int left,int right,int[] tmp){
if (left < right){
int mid = (left + right) / 2;
sortMerge(arr,left,mid,tmp);
sortMerge(arr,mid + 1,right,tmp);
sortMerge(arr,left,mid,right,tmp);
}
}
private static void sortMerge(int[] arr, int left, int mid, int right, int[] tmp) {
int i = left;
int j = mid + 1;
int t = 0;
while (i <= mid && j<= right){
if(arr[i] <= arr[j]){
tmp[t++] = arr[i++];
}else {
tmp[t++] = arr[j++];
}
}
while (i <= mid){
tmp[t++] = arr[i++];
}
while (j < right){
tmp[t++] = arr[j++];
}
t = 0;
while (left < right){
arr[left++] = tmp[t++];
}
}
堆排序
原理
利用java里面自带的PriorityQueue来实现,贼简单
代码实现
public static void main(String[] args) {
int[] arr = {1, 4, 2, 7, 4};
heapSort(arr);
for (int i : arr) {
System.out.print(i + "\t");
}
}
public static void heapSort(int[] arr){
int t = 0;
Queue<Integer> queue = new PriorityQueue<>((a,b) -> a - b);
for (int i = 0; i < arr.length; i++) {
queue.add(arr[i]);
}
while (!queue.isEmpty()){
arr[t++] = queue.poll();
}
}
基数排序
原理
基数排序是一种非比较型整数排序算法,其原理是将整数按位数切割成不同的数字,然后按每个位数分别比较。由于整数也可以表达字符串(比如名字或日期)和特定格式的浮点数,所以基数排序也不是只能使用于整数。
代码实现
public static void main(String[] args) throws Exception {
int[]data = {73, 22, 93, 43, 55, 14, 28, 65, 39, 81, 33, 100};
countSort(data, data.length);
for(int i = 0; i < data.length; i++)
{
System.out.print(data[i] + " ");
}
}
public static void countSort(int[] a,int len) throws Exception {
if (a == null || a.length == 0) throw new Exception("此数组为空,无法排序");
int k = 0;
int maxBit = findMaxBit(a);
int[][] tmpArr = new int[10][a.length];
int[] count = new int[10];
for (int i = 0;i < maxBit;i++){
for (int j = 0;j < len;j++){
int index = (int) (a[j] / Math.pow(10,i) % 10);
tmpArr[index][count[index]] = a[j];
count[index]++;
}
for (int m = 0;m < 10;m++){
if (count[m] != 0) {
for (int n = 0; n < count[m]; n++) {
a[k] = tmpArr[m][n];
k++;
}
count[m] = 0;
}
}
k = 0;
}
}
public static int findMaxBit(int[] a){
int m = 0;
for (int i = 0; i < a.length; i++) {
if(String.valueOf(a[i]).length() > m){
m = String.valueOf(a[i]).length();
}
}
return m;
}