1.冒泡排序
public static void main(String[] args) {
int[] nums = {5,4,2,1,3};
bubbleSort(nums);
System.out.println(Arrays.toString(nums));
}
public static void bubbleSort(int[] nums) {
for(int i=nums.length-1;i>=1;i--){
boolean flag = false; // 优化部分
for(int j=0;j+1<=i;j++){
if(nums[j]>nums[j+1]){
swap(nums,j,j+1);
flag=true;
}
}
if(!flag){
break;
}
}
}
public static void swap(int[] nums, int i, int j) {
int tmp = nums[i];
nums[i] = nums[j];
nums[j] = tmp;
}
2.选择排序
public static void main(String[] args) {
int[] nums = {5,4,1,3,2};
selectionSort(nums);
System.out.println(Arrays.toString(nums));
}
public static void selectionSort(int[] nums) {
for(int i=0;i<nums.length-1;i++){
int idx = i;
for(int j=i+1;j<nums.length;j++){
if(nums[j]<nums[idx]){
idx=j;
}
}
if(idx!=i){
swap(nums,idx,i);
}
}
}
public static void swap(int[] nums, int i, int j) {
int tmp = nums[i];
nums[i] = nums[j];
nums[j] = tmp;
}
3.插入排序
public static void main(String[] args) {
int[] nums = {5,3,1,4,2};
insertionSort(nums);
System.out.println(Arrays.toString(nums));
}
public static void insertionSort(int[] nums) {
for(int i=1;i<nums.length;i++){
int val = nums[i];
int j = i-1;
for(;j>=0;j--){
if(nums[j]>val){
nums[j+1]=nums[j];
}else{
break;
}
}
nums[j+1]=val;
}
}
4.归并排序
public class MergeSort {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int[] nums = new int[n];
for (int i = 0; i < n; i++) nums[i] = sc.nextInt();
mergeSort(nums, 0, n - 1);
for (int i = 0; i < n; i++) System.out.print(nums[i] + " ");
}
public static void mergeSort(int[] a, int l, int r) {
if (l >= r) return;
int mid = (l + r) >> 1;
mergeSort(a, l, mid);
mergeSort(a, mid + 1, r);
int cnt = 0;
int[] tmp = new int[r - l + 1];
int i = l, j = mid + 1;
while (i <= mid && j <= r) {
if (a[i] <= a[j]) {
tmp[cnt++] = a[i++];
}else {
tmp[cnt++] = a[j++];
}
}
while (i <= mid) tmp[cnt++] = a[i++];
while (j <= r) tmp[cnt++] = a[j++];
for (i = l, j = 0; i <= r; i++, j++) a[i] = tmp[j];
}
}
5.快速排序
public class QuickSort {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int[] nums = new int[n];
for (int i = 0; i < n; i++) nums[i] = sc.nextInt();
quickSort(nums, 0, n - 1);
for (int i = 0; i < n; i++) System.out.print(nums[i] + " ");
}
public static void swap(int[] a, int i, int j) {
int tmp = a[i];
a[i] = a[j];
a[j] = tmp;
}
public static void quickSort(int[] a, int l, int r) {
if (l >= r) return;
int i = l - 1, j = r + 1;
int p = a[l];
while (i < j) {
do i++; while (a[i] < p);
do j--; while (a[j] > p);
if (i < j) swap(a, i, j);
}
quickSort(a, l, j);
quickSort(a, j + 1, r);
}
}
6.堆排序
public static void main(String[] args) {
int[] nums = {5,3,1,4,2};
heapSort(nums);
System.out.println(Arrays.toString(nums));
}
public static void heapSort(int[] nums) {
for(int i = nums.length/2 - 1; i >= 0; i--) {
push_up(nums,nums.length,i);
}
for(int i = nums.length-1;i>=1;i--) {
swap(nums,i,0);
push_up(nums,i,0);
}
}
public static void push_up(int[] nums, int len, int idx) {
int i = idx;
while(i*2+1<len){
int left = i*2+1;
int right = i*2+2;
if(right<len && nums[right]>nums[left]) {
left = right;
}
if(nums[left]<=nums[i]){
break;
}
swap(nums,left,i);
i=left;
}
}
public static void swap(int[] a, int i, int j) {
int tmp = a[i];
a[i] = a[j];
a[j] = tmp;
}