package sort;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
public class Main{
//1.快排 + 两种优化
public static void quickSort(List<Integer> arr,int l,int r) {
if(r-l <= 10){ //优化一:当数据量较小时改为插入排序
insertSort(arr);
return;
}
int i=l,j=r;
int key = medi(arr.get(0),arr.get(r-l),arr.get((l+r-l)/2)); //优化二:基准值采用三数取中法
while(i < j){
while(i<j && arr.get(j)>=key) j--;
arr.set(i,arr.get(j));
while(i<j && arr.get(i)<=key) i++;
arr.set(j,arr.get(i));
}
arr.set(i,key);
quickSort(arr,l,i-1);
quickSort(arr,i+1,r);
}
public static int medi(int x, int y, int z) {
int maxV = Math.max(x,y);
maxV = Math.max(maxV,z);
int minV = Math.min(x,y);
minV = Math.min(minV,z);
return x+y+z-minV-maxV;
}
//2.插入排序
public static void insertSort(List<Integer> arr){
int n = arr.size();
for(int i=1;i<n;i++){
int key = arr.get(i),j = i-1;
while(j>=0 && arr.get(j) > key){
arr.set(j+1,arr.get(j));
j--;
}
arr.set(j+1,key);
}
}
//3.归并排序
public static void mergerSort(List<Integer> arr,int left, int right, int[] temp) {
if(right - left <= 1) return;
int mid = left + (right-left)/2;
mergerSort(arr,left,mid,temp);
mergerSort(arr,mid,right,temp);
int i=left,j=mid,index=left;
while(i < mid || j < right){
if(j>=right ||(i<mid && arr.get(i)<arr.get(j)))
temp[index++] = arr.get(i++);
else
temp[index++] = arr.get(j++);
}
for(int k=left;k<right;k++)
arr.set(k,temp[k]);
}
//4.冒泡排序
public static void bubbleSort(List<Integer> arr) {
int n = arr.size();
for(int i=1;i<n;i++){
for(int j=1;j<n-i+1;j++){
if(arr.get(j) < arr.get(j-1)){
int temp = arr.get(j);
arr.set(j,arr.get(j-1));
arr.set(j-1,temp);
}
}
}
}
//5.选择排序
public static void selectSort(List<Integer> arr) {
int n = arr.size();
for(int i=0;i<n;i++){
int min=arr.get(i),minIndex = i;
for(int j=i+1;j<n;j++){
if(arr.get(j) < min){
minIndex = j;
}
int temp = arr.get(i);
arr.set(i,arr.get(minIndex));
arr.set(minIndex,temp);
}
}
}
//6.堆排序
public static void heapSort(List<Integer> arr) {
int n = arr.size();
for(int i=(n-1)/2;i>=0;i--)
adjustHeap(arr,i,n);
for(int i=n-1;i>0;i--){
int temp = arr.get(i);
arr.set(i,arr.get(0));
arr.set(0,temp);
adjustHeap(arr,0,i);
}
}
public static void adjustHeap(List<Integer> arr, int parent, int length) {
int lchild = parent*2 + 1;
int temp = arr.get(parent);
while(lchild < length) {
int rchild = lchild+1;
if(rchild < length && arr.get(lchild)<arr.get(rchild))
lchild++;
if(temp >= arr.get(lchild)) break;
arr.set(parent,arr.get(lchild));
parent = lchild;
lchild = lchild*2 + 1;
}
arr.set(parent,temp);
}
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
while(sc.hasNext()){
String[] str = sc.nextLine().trim().split(" ");
List<Integer> arr = new ArrayList<>();
for(String s : str){
arr.add(Integer.valueOf(s));
}
// quickSort(arr,0,arr.size()-1);
// insertSort(arr);
// mergerSort(arr,0,arr.size(),new int[arr.size()]);
// selectSort(arr);
// bubbleSort(arr);
heapSort(arr);
for(int a : arr)
System.out.print(a + " ");
System.out.println();
}
}
}
Java 实现常见六大排序算法(快排、堆排、归并、选择、冒泡、插入)
最新推荐文章于 2023-02-27 12:53:03 发布
该博客主要展示了优化后的快速排序、插入排序、归并排序、冒泡排序、选择排序和堆排序的Java实现。通过三数取中法优化了快速排序的基准值选取,并在数据量小时切换为插入排序,提高了小规模数据的排序效率。同时,还提供了完整的代码示例。
摘要由CSDN通过智能技术生成