常见排序

来源:互联网 发布:python 图像卷积 编辑:程序博客网 时间:2024/05/29 03:37

一、插入排序

原理:从数组中顺序取值,依次插入一个数组中。

public void insert(int[] array) {// 插入for (int i = 1; i < array.length; i++) {for (int j = i; j > 0; j--) {if (array[j] < array[j - 1]) {swop(array, j - 1, j);} else {break;}}}}


二、冒泡排序

原理:遍历数组,如果相邻的两个数前面的大于后面的,则交换两个数,循环n-1次

public void bubble(int[] array) {// 冒泡for (int i = array.length - 1; i > 0; i--) {for (int j = 0; j < i; j++) {if (array[j + 1] < array[j]) {swop(array, j, j + 1);}}}}

三、选择

原理:依次在选择的数组中选最小的放在开头

public void select(int[] array) {// 选择for (int i = 0; i < array.length - 1; i++) {int min = i;for (int j = i + 1; j < array.length; j++) {if (array[min] > array[j]) {min = j;}}swop(array, i, min);}}

四、快速排序

原理:取第一个数,把数组中比这个数小的放前面,递归调用,直到数组不能再分

public void select(int[] array) {// 选择for (int i = 0; i < array.length - 1; i++) {int min = i;for (int j = i + 1; j < array.length; j++) {if (array[min] > array[j]) {min = j;}}swop(array, i, min);}}

五、堆排序

原理:把数组初始化为一个完全二叉树,满足规则大的为父节点,然后把第一个与最后的交换,调整二叉树,循环

public void heap(int[] array) {// 堆initTree(array, array.length);for (int i = array.length; i > 1; i--) {swop(array, 0, i - 1);resetTree(array, 1, i - 1);}}private void initTree(int[] array, int n) { // 初始化堆for (int i = n / 2; i >= 1; i--) {resetTree(array, i, n);}}private void resetTree(int[] array, int i, int n) { // 重置堆while (i <= n / 2) {int index = i;if (i * 2 <= n && array[i * 2 - 1] > array[index - 1]) {index = i * 2;}if (i * 2 + 1 <= n && array[i * 2] > array[index - 1]) {index = i * 2 + 1;}if (i == index) {break;} else {swop(array, i - 1, index - 1);i = index;}}}

六、归并排序

原理:把数组分成两组,一直分到每个组都只有一个,再反过来依次排序,每次排序多的时候,两边的数组都是有序的

public void merge(int[] array, int start, int end) { // 归并if (start >= end) {return;}int middle = (start + end) / 2;merge(array, start, middle);merge(array, middle + 1, end);int[] result = new int[end - start + 1];int i = start;int j = middle + 1;int k = 0;while (i <= middle && j <= end) {if (array[i] <= array[j]) {result[k++] = array[i++];} else {result[k++] = array[j++];}}while (i <= middle) {result[k++] = array[i++];}while (j <= end) {result[k++] = array[j++];}for (int l = start; l <= end; l++) {array[l] = result[l - start];}}

七、基排序

原理:把数组按照个十百千...依次排序

public void radix(int[] array, int width) { // 基int w = 1;int k = 0;int n = 1;int[][] temp = new int[10][array.length];int[] order = new int[10];while (w <= width) {for (int i = 0; i < array.length; i++) {int num = ((array[i] / n) % 10);temp[num][order[num]++] = array[i];}for (int i = 0; i < 10; i++) {for (int j = 0; j < order[i]; j++) {array[k++] = temp[i][j];}order[i] = 0;}k = 0;n *= 10;w++;}}

八、希尔

原理:除以一个数,把余数相同的放在同一个数组内用插入排序排成有序状态,除数依次从大变到小,直到变为1

public void shell(int[] array) { // 希尔int d = array.length;while (true) {d = d / 2;for (int i = 0; i < d; i++) {for (int j = i + d; j < array.length; j += d) {int temp = array[i];int k;for (k = j - d; k >= 0 && array[k] > temp; k -= d) {array[k + d] = array[k];}array[k + d] = temp;}}if (d == 1) {break;}}}


0 0
原创粉丝点击