排序算法Java实现

个人博客:小景哥哥

在这里插入图片描述

package top.jinglisen.algorithms;

public class Sorts {

	//1.直接插入排序
	public static void insertSort(int[] a) {
		for(int i = 1; i < a.length; i++) {
			int t = a[i];
			int j = i;
			for(; j >= 1; j--) {
				if(t < a[j - 1]) 
					a[j] = a[j - 1];
				else 
					break;
			}
			a[j] = t;
		}
	}
	
	//2.希尔排序
	public static void shellSort(int[] a) {
		int t;
		for(int gap = a.length / 2; gap > 0; gap /= 2) {
			for(int i = gap; i < a.length; i++) {
				t = a[i];
				int j = i;
				for(; j >= gap; j -= gap) {
					if(t < a[j - gap])
						a[j] = a[j - gap];
					else 
						break;
				}
				a[j] = t;
			}
		}
	}
	//3.简单选择排序
	//在要排序的一组数中,选出最小(或者最大)的一个数与第1个位置的数交换;然后在剩下的数当中再找最小(或者最大)的与第2个位置的数交换,依次类推,直到第n-1个元素(倒数第二个数)和第n个元素(最后一个数)比较为止。
	public static void selectSort(int[] a) {
		for(int i = 0; i < a.length; i++) {
			int min = i;
			for(int j = i + 1; j < a.length; j++) {
				if(a[min] > a[j]){
					min = j;
				}
			}
			int t = a[i];
			a[i] = a[min];
			a[min] = t;
		}
	}
	
	//4.堆排序
	public static void heapSort(int[] a) {
		buildMaxHeap(a);
		for(int i = a.length - 1; i > 0; i--) {
			swap(a, 0, i);
			percDown(a, 0, i);
		}
	}
	public static void buildMaxHeap(int[] a) {
		//最后一个有孩子的结点位置: i = (length - 1) / 2
		for(int i = a.length / 2 - 1; i >= 0; i--) {
			percDown(a, i, a.length);
		}
	}
	public static void percDown(int[] a, int i, int n) {
		int child;
		int tmp;
		for(tmp = a[i]; 2 * i + 1 < n; i = child) {
			child = 2 * i + 1;
			if(child != n - 1 && a[child] < a[child + 1])//选择两个孩子中较大者
				child++;
			if(tmp < a[child])//tmp比两个孩子中较大者还小,把较大者提升为父节点
				a[i] = a[child];
			else
				break;
		}
		a[i] = tmp;
	}
	public static void swap(int[]a, int i, int j) {
		int tmp = a[i];
		a[i] = a[j];
		a[j] = tmp;
	}
	
	//5.冒泡排序
	public static void bubbleSort(int[] a) {
		for(int i = 0; i < a.length; i++) {
			for(int j = i + 1; j < a.length; j++) {
				if(a[i] > a[j]) {
					int tmp = a[i];
					a[i] = a[j];
					a[j] = tmp;
				}
			}
		}
	}
	//6.快速排序
	public static void quickSort(int[] a) {
		quickSort(a, 0, a.length - 1);
	}
	public static void quickSort(int[] a, int l, int r) {
		if(l < r) {
			int m = partion(a, l, r);
			quickSort(a, 0, m - 1);
			quickSort(a, m + 1, r);
		}
	}
	public static int partion(int[] a, int l, int r) {
		int privotKey = a[l];
		while(l < r) {
			while(l < r && a[r] >= privotKey)
				--r;
			swap(a, l, r);
			while(l < r && a[l] <= privotKey)
				++l;
			swap(a, l, r);
		}
		return l;
	}
	
	//7.归并排序
	public static void mergeSort(int[] a) {
		int[] tmpArray = new int[a.length];
		mergeSort(a, tmpArray, 0, a.length - 1);
	}
	public static void mergeSort(int[] a, int[] tmpArray, int left, int right) {
		if(left < right) {
			int center = (left + right) / 2;
			mergeSort(a, tmpArray, left, center);
			mergeSort(a, tmpArray, center + 1, right);
			merge(a, tmpArray, left, center + 1, right);
		}
	}
	public static void merge(int[] a, int[] tmpArray, int leftPos, int rightPos, int rightEnd) {
		int leftEnd = rightPos - 1;
		int tmpPos = leftPos;
		int numElements = rightEnd - leftPos + 1;
		
		while(leftPos <= leftEnd && rightPos <= rightEnd) {
			if(a[leftPos] <= a[rightPos])
				tmpArray[tmpPos++] = a[leftPos++];
			else
				tmpArray[tmpPos++] = a[rightPos++];
		}
		while(leftPos <= leftEnd)
			tmpArray[tmpPos++] = a[leftPos++];
		while(rightPos <= rightEnd)
			tmpArray[tmpPos++] = a[rightPos++];
		for(int i = 0; i < numElements; i++, rightEnd--) {
			a[rightEnd] = tmpArray[rightEnd];
		}
	}
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Java中,可以通过直接插入排序、希尔排序和堆排序来实现排序算法。 直接插入排序的Java实现可以参考以下代码: ```java import java.util.Arrays; public class InsertSortDemo { public static void insertSort(int[] arr) { for (int i = 1; i < arr.length; i++) { int key = arr[i]; int j = i - 1; while (j >= 0 && arr[j > key) { arr[j + 1 = arr[j]; j--; } arr[j + 1 = key; } } public static void main(String[] args) { int[] arrTest = {0, 1, 5, 8, 3, 7, 4, 6, 2}; System.out.println("before: " + Arrays.toString(arrTest)); insertSort(arrTest); System.out.println("after: " + Arrays.toString(arrTest)); } } ``` 希尔排序的Java实现可以参考以下代码: ```java import java.util.Arrays; public class ShellSortDemo { public static void shellSort(int[] arr) { int n = arr.length; for (int gap = n / 2; gap > 0; gap /= 2) { for (int i = gap; i < n; i++) { int key = arr[i]; int j = i; while (j >= gap && arr[j - gap > key) { arr[j = arr[j - gap]; j -= gap; } arr[j = key; } } } public static void main(String[] args) { int[] arrTest = {0, 1, 5, 8, 3, 7, 4, 6, 2}; System.out.println("before: " + Arrays.toString(arrTest)); shellSort(arrTest); System.out.println("after: " + Arrays.toString(arrTest)); } } ``` 堆排序的Java实现可以参考以下代码: ```java import java.util.Arrays; public class HeapSortDemo { public static void heapSort(int[] arr) { int n = arr.length; // 构建大顶堆 for (int i = n / 2 - 1; i >= 0; i--) { heapify(arr, n, i); } // 依次将堆顶元素与末尾元素交换,并重新构建堆 for (int i = n - 1; i > 0; i--) { int temp = arr = arr[i]; arr[i = temp; heapify(arr, i, 0); } } public static void heapify(int[] arr, int n, int i) { int largest = i; int left = 2 * i + 1; int right = 2 * i + 2; if (left < n && arr[left > arr[largest]) { largest = left; } if (right < n && arr[right > arr[largest]) { largest = right; } if (largest != i) { int temp = arr[i]; arr[i = arr[largest]; arr[largest = temp; heapify(arr, n, largest); } } public static void main(String[] args) { int[] arrTest = {0, 1, 5, 8, 3, 7, 4, 6, 2}; System.out.println("before: " + Arrays.toString(arrTest)); heapSort(arrTest); System.out.println("after: " + Arrays.toString(arrTest)); } } ``` 以上是三种常见排序算法Java实现。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [java实现七种经典排序算法](https://blog.csdn.net/qq_27498287/article/details/126049089)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

勤奋的凯尔森同学

你的鼓励将是我创作的最大动力!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值