/**
* 常用排序算法:https://blog.csdn.net/yushiyi6453/article/details/76407640
* 简单选择排序:https://www.cnblogs.com/jingmoxukong/p/4303289.html
* 归并排序:https://www.cnblogs.com/skywang12345/p/3602369.html
*/
package cn.edu.ncu.algorith;
import java.util.Arrays;
/**
* @author Mr.Xu
* @TODO 直接插入排序
* @date 2018年11月10日
*/
public class AllSort {
/**
*
* @author Mr.Xu
* @TODO TODO 直接插入排序 :把未排序的数字插入到已经排序中
* @Linded https://www.cnblogs.com/xsyfl/p/6869432.html
* 时间复杂度:O(n^2).
* @date 2018年11月10日
*/
public void insertSort(int[] nums){
int temp,j;
for(int i=1;i<nums.length;i++){
temp=nums[i];
for(j=i-1;j>=0;j--){
if(temp<nums[j]){
nums[j+1]=nums[j];
}else{
break;
}
}
nums[j+1]=temp;
}
System.out.println("直接插入排序执行之后");
System.out.println(Arrays.toString(nums));
}
/**
*
* @author Mr.Xu
* @TODO TODO简单选择排序:每次在未排序里面找寻最小的放入未排序中的第一个
* @date 2018年11月10日
*/
public void selectSort(int[] nums){
int temp,min;
for(int i=0;i<nums.length;i++){
min=i;
for(int j=i+1;j<nums.length;j++){
if(nums[j]<nums[min])min=j;
}
if(min!=i){
temp=nums[min];
nums[min]=nums[i];
nums[i]=temp;
}
}
System.out.println("简单选择排序执行之后");
System.out.println(Arrays.toString(nums));
}
/**
*
* @author Mr.Xu
* @TODO TODO冒泡排序:每次排序把最大值放到最后
* @date 2018年11月10日
*/
public void bubbleSort(int[] nums){
int temp;
for (int i = 0; i < nums.length-1; i++) {//循环一次最底拍好一个数
for (int j = 0; j < nums.length-i-1; j++) {//
if(nums[j]>nums[j+1]){
temp=nums[j];
nums[j]=nums[j+1];
nums[j+1]=temp;
}
}
}
System.out.println("冒泡排序执行之后");
System.out.println(Arrays.toString(nums));
}
/**
*
* @author Mr.Xu
* @TODO TODO快速排序:对范围内的进行排序
* @date 2018年11月10日
*/
public void quickSort(int[] nums){
quickSortImpl(nums, 0, nums.length-1);
System.out.println("快速排序执行之后");
System.out.println(Arrays.toString(nums));
}
private void quickSortImpl(int[] nums,int start,int end){
if(start<end){
int mid = partition(nums,start,end);
quickSortImpl(nums, start, mid-1);
quickSortImpl(nums, mid+1, end);
}
}
private int partition(int[] nums,int start,int end){
int temp=nums[start];
while(start<end){
while(start<end&&nums[end]>temp) end--;
nums[start]=nums[end];
while(start<end&&nums[start]<temp) start++;
nums[end]=nums[start];
}
nums[start]=temp;
return start;
}
/**
*
* @author Mr.Xu
* @TODO TODO归并排序:二分思想 把数字分成一个一个的排序,在合并起来排序
* @date 2018年11月10日
*/
public void mergeSort(int[] nums){
mergeSortImple(nums,0,nums.length-1);
System.out.println("归并排序执行之后");
System.out.println(Arrays.toString(nums));
}
private void mergeSortImple(int[] nums,int start,int end){
if(start==end) return;
int mid=(start+end)/2;
mergeSortImple(nums, start, mid);
mergeSortImple(nums, mid+1, end);
dac(nums, start, mid,end);
}
private void dac(int[] nums,int start,int mid,int end){
int[] temp=new int[end-start+1];
int s=start;
int m=mid+1;
int j=0;
while(s<=mid&&m<=end){
if(nums[s]<=nums[m]) {
temp[j++]=nums[s++];
}else {
temp[j++]=nums[m++];
}
}
while(s<=mid)temp[j++]=nums[s++];
while(m<=end)temp[j++]=nums[m++];
while(j>0) nums[end--]=temp[--j];//j在上面多加了一个1
}
public static void main(String[] args) {
int[] arr = new int[]{3,1,5,4,2};
System.out.println("执行之前:");
System.out.println(Arrays.toString(arr));
new AllSort().insertSort(new int[]{3,1,5,4,2});
new AllSort().selectSort(new int[]{3,1,5,4,2});
new AllSort().bubbleSort(new int[]{3,1,5,4,2});
new AllSort().quickSort(new int[]{3,1,5,4,2});
new AllSort().mergeSort(new int[]{3,1,5,4,2});
}
}