//插入排序 从小到大 //此算法在运行过程中会在一端形成排序好的数列,插入的数据的任务就是让出自己现有的位置, // 将排序好的数列中的大数一步步往后移动,自己找到合适位置入位 public int[] charu(int[] a) { int len = a.length;//单独把数组长度拿出来,提高效率 int insertNum;//要插入的数 for (int i = 1; i < len; i++) {//因为第一次不用,所以从1开始 insertNum = a[i]; int j = i - 1;//序列元素个数 while (j >= 0 && a[j] > insertNum) {//从后往前循环,将大于insertNum的数向后移动 a[j + 1] = a[j];//元素向后移动 j--; } a[j + 1] = insertNum;//找到位置,插入当前元素 } return a; } //希尔排序,插入法的升级版 public int[] xier(int[] a) { int len = a.length;//单独把数组长度拿出来,提高效率 while (len != 0) { len = len / 2; for (int i = 0; i < len; i++) {//分组 for (int j = i + len; j < a.length; j += len) {//元素从第二个开始 int k = j - len;//k为有序序列最后一位的位数 int temp = a[j];//要插入的元素 while (k >= 0 && temp < a[k]) {//从后往前遍历 a[k + len] = a[k]; k -= len;//向后移动len位 } a[k + len] = temp; } } } return a; } //选择排序 不实时交换,只记需要交换的坐标与值 //默认从i(0-len)为最小,与后边的值进行比较,如果比默认值小,记录此值与坐标,再继续与后边比较,最后与i进行交换 public int[] xuanze(int[] a) { int len = a.length; for (int i = 0; i < len; i++) {//循环次数 int value = a[i]; int position = i; for (int j = i + 1; j < len; j++) {//找到最小的值和位置 if (a[j] < value) { value = a[j]; position = j; } } a[position] = a[i];//进行交换 a[i] = value; } return a; } //堆排序 选择排序升级版 public int[] dui(int[] a) { int len = a.length; //循环建堆 for (int i = 0; i < len - 1; i++) { //建堆 //从lastIndex处节点(最后一个节点)的父节点开始 for (int j = (len - 1 - i - 1) / 2; j >= 0; j--) { //k保存正在判断的节点 int k = j; //如果当前k节点的子节点存在 while (k * 2 + 1 <= len - 1 - i) { //k节点的左子节点的索引 int biggerIndex = 2 * k + 1; //如果biggerIndex小于lastIndex,即biggerIndex+1代表的k节点的右子节点存在 if (biggerIndex < len - 1 - i) { //若果右子节点的值较大 if (a[biggerIndex] < a[biggerIndex + 1]) { //biggerIndex总是记录较大子节点的索引 biggerIndex++; } } //如果k节点的值小于其较大的子节点的值 if (a[k] < a[biggerIndex]) { //交换他们 int tmp = a[k]; a[k] = a[biggerIndex]; a[biggerIndex] = tmp; //将biggerIndex赋予k,开始while循环的下一次循环,重新保证k节点的值大于其左右子节点的值 k = biggerIndex; } else { break; } } } int tmp = a[0]; a[0] = a[len - 1 - i]; a[len - 1 - i] = tmp; } return a; } //冒泡排序 将序列中所有元素两两比较,将最大的放在最后面 public int[] maopao(int[] a) { int len = a.length; for (int i = 0; i < len; i++) { for (int j = 0; j < len - i - 1; j++) {//注意第二重循环的条件 if (a[j] > a[j + 1]) { int temp = a[j]; a[j] = a[j + 1]; a[j + 1] = temp; } } } return a; } //快速排序 //选择第一个数为p,小于p的数放在左边,大于p的数放在右边。 //递归的将p左边和右边的数都按照第一步进行,直到不能递归。 public int[] kuaisu(int[] a, int start, int end) { int baseNum = a[start];//选基准值 int midNum;//记录中间值 int i = start; int j = end; do { while ((a[i] < baseNum) && i < end) { i++; } while ((a[j] > baseNum) && j > start) { j--; } if (i <= j) { midNum = a[i]; a[i] = a[j]; a[j] = midNum; i++; j--; } } while (i <= j); if (start < j) { kuaisu(a, start, j); } if (end > i) { kuaisu(a, i, end); } return a; } //归并排序 速度仅次于快速排序,内存少 //1.选择相邻两个数组成一个有序序列。 //2.选择相邻的两个有序序列组成一个有序序列。 //3.重复第二步,直到全部组成一个有序序列。 public void mergeSort(int[] a, int left, int right) { int t = 1;// 每组元素个数 int size = right - left + 1; while (t < size) { int s = t;// 本次循环每组元素个数 t = 2 * s; int i = left; while (i + (t - 1) < size) { merge(a, i, i + (s - 1), i + (t - 1)); i += t; } if (i + (s - 1) < right) merge(a, i, i + (s - 1), right); } } private static void merge(int[] data, int p, int q, int r) { int[] B = new int[data.length]; int s = p; int t = q + 1; int k = p; while (s <= q && t <= r) { if (data[s] <= data[t]) { B[k] = data[s]; s++; } else { B[k] = data[t]; t++; } k++; } if (s == q + 1) B[k++] = data[t++]; else B[k++] = data[s++]; for (int i = p; i <= r; i++) data[i] = B[i]; } //基数排序 //将所有的数的个位数取出,按照个位数进行排序,构成一个序列。 //将新构成的所有的数的十位数取出,按照十位数进行排序,构成一个序列。 public void baseSort(int[] a) { //首先确定排序的趟数; int max = a[0]; for (int i = 1; i < a.length; i++) { if (a[i] > max) { max = a[i]; } } int time = 0; //判断位数; while (max > 0) { max /= 10; time++; } //建立10个队列; List<ArrayList<Integer>> queue = new ArrayList<ArrayList<Integer>>(); for (int i = 0; i < 10; i++) { ArrayList<Integer> queue1 = new ArrayList<Integer>(); queue.add(queue1); } //进行time次分配和收集; for (int i = 0; i < time; i++) { //分配数组元素; for (int j = 0; j < a.length; j++) { //得到数字的第time+1位数; int x = a[j] % (int) Math.pow(10, i + 1) / (int) Math.pow(10, i); ArrayList<Integer> queue2 = queue.get(x); queue2.add(a[j]); queue.set(x, queue2); } int count = 0;//元素计数器; //收集队列元素; for (int k = 0; k < 10; k++) { while (queue.get(k).size() > 0) { ArrayList<Integer> queue3 = queue.get(k); a[count] = queue3.get(0); queue3.remove(0); count++; } } } }
Java 8种排序算法集合
最新推荐文章于 2023-02-24 13:18:51 发布