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];
}
}
}