Java数据结构_7.排序算法(冒泡排序、快速排序、插入排序、希尔排序、选择排序、归并排序、基数排序、队列实现基数排序)

一、冒泡排序

package com.paixu;

import java.util.Arrays;

public class BubbleSort {

	public static void main(String[] args) {
		int[] arr = new int[] { 5, 7, 2, 15, 6, 9, 7, 3, 6, 8 };
		System.out.println("排序前:" + Arrays.toString(arr));
		bubbleSort(arr);
		System.out.println("排序后:" + Arrays.toString(arr));
	}

	// 冒泡排序
	// 5, 7, 2, 15, 6, 9, 7, 3, 6, 8
	// 共需要比较length-1轮
	// 第一轮比完找到最大值放在最后 5, 7, 2, 6, 9, 7, 3, 6, 8, 15
	public static void bubbleSort(int[] arr) {
		int k = 1;
		// 共比较多少轮
		for (int i = 0; i < arr.length - 1; i++) {
			// 比较次数
			for (int j = 0; j < arr.length - 1 - i; j++) {
				// 左边大于右边则交换
				if (arr[j] > arr[j + 1]) {
					int temp = arr[j];
					arr[j] = arr[j + 1];
					arr[j + 1] = temp;
				}
			}
			System.out.println("第" + k + "次排列结果为:" + Arrays.toString(arr));
			k++;
		}
	}

}

二、快速排序

package com.paixu;

import java.util.Arrays;

public class QuickSort {

	public static void main(String[] args) {
		int[] arr = new int[] { 5, 7, 2, 15, 6, 9, 7, 3, 6, 8, 3, 5, 6, 4, 11, 22, 31, 0, 2, 5, 14 };
		System.out.println("排序前:" + Arrays.toString(arr));
		quickSort(arr, 0, arr.length - 1);
		System.out.println("排序后:" + Arrays.toString(arr));
	}

	// 快速排序
	public static void quickSort(int[] arr, int start, int end) {
		int k = 1;
		if (start < end) {
			// 把数组中第0个数字作为标准数
			int stard = arr[start];
			// 记录需要排序的下标
			int low = start;
			int high = end;
			// 循环找比标准数大的数和比标准数小的数
			while (low < high) {
				// 右边的数字比标准数大,右标准左移
				while (low < high && stard <= arr[high]) {
					high--;
				}
				// 右边数字比标准数小,使用右边的数替换左边的数
				arr[low] = arr[high];
				// 左边的数比标准数小,左标准右移
				while (low < high && arr[low] <= stard) {
					low++;
				}
				// 左边数字比标准数小,使用左边的数替换右边的数
				arr[high] = arr[low];
			}
			// 最后把标准数赋给到最终剩下的一个数
			arr[low] = stard;
			// 处理所有左边数,处理所有右边数
			quickSort(arr, start, low);
			quickSort(arr, low + 1, end);
		}
	}
}

三、插入排序

package com.paixu;

import java.util.Arrays;

public class InsertSort {

	public static void main(String[] args) {
		int arr[] = new int[] { 5, 3, 6, 7, 8, 9, 5, 1, 1, 21, 23, 51, 41, 17, 4 };
		System.out.println("排序前:" + Arrays.toString(arr));
		insertSort(arr);
		System.out.println("排序后:" + Arrays.toString(arr));
	}

	// 插入排序
	public static void insertSort(int arr[]) {
		int k = 1;
		// 遍历所有的数字
		for (int i = 1; i < arr.length; i++) {
			if (arr[i] < arr[i - 1]) {
				int temp = arr[i];
				int j;
				// 遍历当前数组前面的数字
				for (j = i - 1; j >= 0 && arr[j] > temp; j--) {
					arr[j + 1] = arr[j];
				}
				arr[j + 1] = temp;
			}
			System.out.println("第" + k + "次排列结果为:" + Arrays.toString(arr));
			k++;
		}
	}
}

四、希尔排序

package com.paixu;

import java.util.Arrays;

public class ShellSort {

	public static void main(String[] args) {
		int arr[] = new int[] { 5, 3, 6, 7, 8, 9, 5, 1, 1, 21, 23, 51, 41, 17, 4 };
		System.out.println("排序前:" + Arrays.toString(arr));
		shellSort(arr);
		System.out.println("排序后:" + Arrays.toString(arr));
	}

	// 希尔排序(比直接插入排序效率更高)
	public static void shellSort(int[] arr) {
		int k = 1;
		// 遍历所有的步长(增量)
		for (int d = arr.length / 2; d > 0; d /= 2) {
			// 遍历所有元素
			for (int i = d; i < arr.length; i++) {
				// 遍历本组中所有元素
				for (int j = i - d; j >= 0; j -= d) {
					if (arr[j] > arr[j + d]) {
						int temp = arr[j];
						arr[j] = arr[j + d];
						arr[j + d] = temp;
					}
				}
			}
			System.out.println("第" + k + "次排列结果为:" + Arrays.toString(arr));
			k++;
		}
	}

}

五、选择排序

package com.paixu;

import java.util.Arrays;

public class SelectSort {

	public static void main(String[] args) {
		int arr[] = new int[] { 5, 3, 6, 7, 8, 9, 5, 1, 1, 21, 23, 51, 41, 17, 4 };
		System.out.println("排序前:" + Arrays.toString(arr));
		selectSort(arr);
		System.out.println("排序后:" + Arrays.toString(arr));
	}

	// 选择排序
	public static void selectSort(int[] arr) {
		int k = 1;
		for (int i = 0; i < arr.length; i++) {
			int minIndex = i;
			// 把当前遍历的数和后面的所有数依次比较,并记录最小的数下标
			for (int j = i + 1; j < arr.length; j++) {
				if (arr[minIndex] > arr[j]) {
					minIndex = j;
				}
			}
			// 如果最小的数和当前遍历的数不一致,交换
			if (i != minIndex) {
				int temp = arr[i];
				arr[i] = arr[minIndex];
				arr[minIndex] = temp;
			}
			System.out.println("第" + k + "次排列结果为:" + Arrays.toString(arr));
			k++;
		}
	}

}

六、归并排序

package com.paixu;

import java.util.Arrays;

public class MergeSort {

	public static void main(String[] args) {
		int arr[] = new int[] { 5, 3, 6, 7, 8, 9, 5, 1, 1, 21, 23, 51, 41, 17, 4 };
		System.out.println("排序前:" + Arrays.toString(arr));
		mergeSort(arr, 0, arr.length - 1);
		System.out.println("排序后:" + Arrays.toString(arr));
	}

	// 归并排序
	public static void mergeSort(int[] arr, int low, int high) {
		int middle = (high + low) / 2;
		if (low < high) {
			mergeSort(arr, low, middle);
			mergeSort(arr, middle + 1, high);
			merge(arr, low, middle, high);
		}
	}

	public static void merge(int[] arr, int low, int middle, int high) {
		// 用于存储归并后的临时数组
		int[] temp = new int[high - low + 1];
		// 用于记录第一个数组中需要遍历的下标
		int i = low;
		// 用于记录第一个数组中需要遍历的下标
		int j = middle + 1;
		// 用于记录在临时数组中存放的下标
		int index = 0;
		// 遍历两个数组,取出小的数字放入临时数组中
		while (i <= middle && j <= high) {
			if (arr[i] <= arr[j]) {
				temp[index] = arr[i];
				i++;
			} else {
				temp[index] = arr[j];
				j++;
			}
			index++;
		}
		// 处理多余的数据
		while (j <= high) {
			temp[index] = arr[j];
			j++;
			index++;
		}
		while (i <= middle) {
			temp[index] = arr[i];
			i++;
			index++;
		}
		// 把临时数组中的数放入原数组
		for (int k = 0; k < temp.length; k++) {
			arr[k + low] = temp[k];
		}
	}

}

七、基数排序

package com.paixu;

import java.util.Arrays;

public class RadixSort {

	public static void main(String[] args) {
		int[] arr = new int[] { 1, 58, 156, 68, 445, 2221, 485, 45, 469, 574, 11, 322, 3, 45, 68, 45 };
		radixSort(arr);
		System.out.println(Arrays.toString(arr));
	}

	// 基数排序
	public static void radixSort(int[] arr) {
		// 最大数
		int max = Integer.MIN_VALUE;
		for (int i = 0; i < arr.length; i++) {
			if (arr[i] > max) {
				max = arr[i];
			}
		}
		// 计算最大数是几位数
		int maxLength = (max + "").length();
		// 用于临时存储数据的二维数组
		int[][] temp = new int[10][arr.length];
		// 用于记录在temp中相应数组存的数的数量
		int[] counts = new int[10];
		// 根据最大长度的数决定比较的次数
		for (int i = 0, n = 1; i < maxLength; i++, n *= 10) {// n:第一次取个位,第二次取百位...
			// 把每个数分别计算余数
			for (int j = 0; j < arr.length; j++) {
				// 计算余数
				int ys = arr[j] / n % 10;
				temp[ys][counts[ys]] = arr[j];
				counts[ys]++;
			}
			// 记录取得元素需要放到原数组的位置
			int index = 0;
			// 把数字取出来
			for (int k = 0; k < counts.length; k++) {
				if (counts[k] != 0) {
					for (int l = 0; l < counts[k]; l++) {
						arr[index] = temp[k][l];
						index++;
					}
					// 把数量置为0
					counts[k] = 0;
				}
			}
		}
	}
}

八、队列实现基数排序

1.队列

package com.paixu;

/**
 * 队列:先进先出
 * 
 * @author l1
 *
 */
public class MyQueue {
	int[] elements;

	public MyQueue() {
		elements = new int[0];
	}

	// 查看队列中所有元素
	public String show() {
		String stringQueue = "";
		for (int i = 0; i < elements.length; i++) {
			stringQueue += elements[i] + " ";
		}
		return stringQueue;
	}

	// 入队
	public void add(int element) {
		int newArr[] = new int[elements.length + 1];
		for (int i = 0; i < elements.length; i++) {
			newArr[i] = elements[i];
		}
		newArr[elements.length] = element;
		elements = newArr;
	}

	// 出队
	public int poll() {
		// 把数组第0个元素取出
		int element = elements[0];
		int[] newArr = new int[elements.length - 1];
		// 复制原数组中的元素到新数组中
		for (int i = 0; i < newArr.length; i++) {
			newArr[i] = elements[i + 1];
		}
		// 替换数组
		elements = newArr;
		return element;
	}

	// 判断队列是否为空
	public boolean isEmpty() {
		return elements.length == 0;
	}
}

2.排序

package com.paixu;

import java.util.Arrays;

public class RadixMyQueueSort {

	public static void main(String[] args) {
		int[] arr = new int[] { 1, 58, 156, 68, 445, 2221, 485, 45, 469, 574, 11, 322, 3, 45, 68, 45 };
		radixSort(arr);
		System.out.println(Arrays.toString(arr));
	}

	// 队列实现基数排序
	public static void radixSort(int[] arr) {
		// 最大数
		int max = Integer.MIN_VALUE;
		for (int i = 0; i < arr.length; i++) {
			if (arr[i] > max) {
				max = arr[i];
			}
		}
		// 计算最大数是几位数
		int maxLength = (max + "").length();
		// 用于临时存储数据的队列数组
		MyQueue temp[] = new MyQueue[10];
		// 为队列数组赋值
		for (int i = 0; i < temp.length; i++) {
			temp[i] = new MyQueue();
		}
		// 根据最大长度的数决定比较的次数
		for (int i = 0, n = 1; i < maxLength; i++, n *= 10) {// n:第一次取个位,第二次取百位...
			// 把每个数分别计算余数
			for (int j = 0; j < arr.length; j++) {
				// 计算余数
				int ys = arr[j] / n % 10;
				temp[ys].add(arr[j]);
			}
			// 记录取得元素需要放到原数组的位置
			int index = 0;
			// 把数字取出来
			for (int k = 0; k < temp.length; k++) {
				while (!temp[k].isEmpty()) {
					arr[index] = temp[k].poll();
					index++;
				}
			}
		}
	}
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值