首页 > 代码库 > sort
sort
几种基础排序的学习
冒(冒泡)>选(选择)>插(插入)>希(希尔)>快(快速)>归(归并)>堆
时间复杂度
冒-O(n^2)
选-O(n^2)
插-O(n^2)
希-O(n*logn)
快-O(n*logn)
归-O(n*logn)
堆-O(n*logn)
(1)冒泡排序:
package com.jp.algorithm.sort;/** * 1. 冒泡排序 * @author hadoop * */public class BubbleSort { public static void main(String[] args) { // 整数类型数组(原始数据类型),随便定义 int[] numbs = { 87, 25, 4, 22, 2, 56, 11, 28, 35, 15 }; // 定义一个临时交换变量 int temp = 0; for (int i = 0; i < numbs.length; i++) { for (int j = 0; j < numbs.length - 1; j++) { if (numbs[i] < numbs[j]) { // 没有动作 } else { temp = numbs[i]; numbs[i] = numbs[j]; numbs[j] = temp; } } } // 打印冒泡排序过后的数组 for (int i = 0; i < numbs.length; i++) { System.out.println(numbs[i]); } }}
(2)选择排序:
package com.jp.algorithm.sort;/** * 2.选择排序 * * 从所有的当中选择出要得放到一头 * * @author peng.jia * */public class SelectSort { public static void Sort(int[] sort) { for (int i = 0; i < sort.length - 1; i++) { for (int j = i + 1; j < sort.length; j++) { if (sort[i] > sort[j]) { int temp; temp = sort[i]; sort[i] = sort[j]; sort[j] = temp; } } } } public static void main(String[] args) { int[] sort = { 8, 5, 7, 9, 55 }; for (int i = 0; i < sort.length; i++) { System.out.print(sort[i] + " "); } Sort(sort); System.out.println("\n================= "); for (int i = 0; i < sort.length; i++) { System.out.print(sort[i] + " "); } }}
(3)插入排序:
package com.jp.algorithm.sort;/** * 3.插入排序 * * @author peng.jia * */public class InsertSort { // 插入排序法 public static void sort(int arr[]) { for (int i = 1; i < arr.length; i++) { int insertVal = arr[i]; // insertValue准备和前一个数比较 int index = i - 1; while (index >= 0 && insertVal < arr[index]) { // 将把arr[index]向后移动 arr[index + 1] = arr[index]; // 让index向前移动一位 index--; } // 将insertValue插入到适当位置 arr[index + 1] = insertVal; } } public static void main(String[] args) { int[] array = { 1, 3, 5, 7, 9, 2, 4, 6, 8, 0 }; for (int i = 0; i < array.length; i++) { System.out.print(array[i] + " "); } sort(array); System.out.println("\n================= "); for (int i = 0; i < array.length; i++) { System.out.print(array[i] + " "); } }}
(4)希尔排序:
package com.jp.algorithm.sort;/** * * * 4.希尔排序-先对位排序再插入排序 * * 希尔排序的原理:根据需求,如果你想要结果从大到小排列,它会首先将数组进行分组,然后将较大值移到前面,较小值 * 移到后面,最后将整个数组进行插入排序,这样比起一开始就用插入排序减少了数据交换和移动的次数,可以说希尔排序是加强 版的插入排序 拿数组5, 2, 8, * 9, 1, 3,4来说,数组长度为7,当increment为3时,数组分为两个序列 * 5,2,8和9,1,3,4,第一次排序,9和5比较,1和2比较,3和8比较,4和比其下标值小increment的数组值相比较 * 此例子是按照从大到小排列,所以大的会排在前面,第一次排序后数组为9, 2, 8, 5, 1, 3,4 * 第一次后increment的值变为3/2=1,此时对数组进行插入排序, * * @author peng.jia * */public class ShellSort { public static void shellSort(int[] data) { int j = 0; int temp = 0; for (int increment = data.length / 2; increment > 0; increment /= 2) { for (int i = increment; i < data.length; i++) { temp = data[i]; for (j = i; j >= increment; j -= increment) { if (temp > data[j - increment]) { data[j] = data[j - increment]; } else { break; } } data[j] = temp; } } } public static void main(String[] args) { int[] data = http://www.mamicode.com/new int[] { 5, 2, 8, 9, 1, 3, 4 };"未排序前"); for (int i = 0; i < data.length; i++) { System.out.print(data[i] + " "); } shellSort(data); System.out.println("\n排序后"); for (int i = 0; i < data.length; i++) System.out.print(data[i] + " "); }}
(5)快速排序:
package com.jp.algorithm.sort;/** * 5.快速排序-左右换,直到换到中间分裂 * * @author peng.jia * */public class QuickSort { /** * @param pData * 需要排序的数组 * @param left * 左边的位置,初始值为0 * @param right * 右边的位置,初始值为数组长度 */ public static void QuickSort(int[] pData, int left, int right) { int i, j; int first, temp; i = left; j = right; first = pData[left]; // 这里选其他的数也行,不过一般选第一个 // 一趟快速排序 while (true) { // 从第二个数开始找大于中枢的数 ,从前面开始找大于pData[left]的数 while ((++i) < right - 1 && pData[i] < first) ; // 从最后一个数开始找第一个小于中枢pData[left]的数 while ((--j) > left && pData[j] > first) ; if (i >= j) break; // 交换两边找到的数 temp = pData[i]; pData[i] = pData[j]; pData[j] = temp; } // 交换中枢 pData[left] = pData[j]; pData[j] = first; // 递归快排中枢左边的数据 if (left < j) QuickSort(pData, left, j); // 递归快排中枢右边的数据 if (right > i) QuickSort(pData, i, right); } public static void main(String[] args) { final int SORT_COUNT = (int) (Math.random() * 10 + 1);// 参与排序的数字数量随机产生 int[] pData = http://www.mamicode.com/new int[SORT_COUNT];" "); } QuickSort.QuickSort(pData, 0, pData.length); System.out.println("\n***********************"); for (int i = 0; i < pData.length; i++) { System.out.print(pData[i] + " "); } }}
(6)归并排序:
package com.jp.algorithm.sort;/** * 6.归并排序-最小两两合并,不断壮大排序集 * * @author peng.jia * */public class MergeSort { /** * 归并排序 先将初始的序列表看成是n个长度为1的有序表 (1)定义指针i,指向第一个序列表的第一个元素 * (2)定义指针j,指向第二个序列表的第一个元素 (3)比较i,j指向的元素大小,若前者大,将后者插入到新表中 否则,把前者插入到新表中 * (4)直到取完第一个序列表或者第二个序列表为止 * * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub int[] num = { 51, 38, 49, 27, 62, 05, 16 }; int[] num1 = new int[7]; num = mergesort(num, 0, num.length - 1, num1); for (int i : num) { System.out.print(i + " "); } } private static int[] mergesort(int[] num, int s, int t, int[] num1) { int m; int[] num2 = new int[t + 1]; if (s == t) num1[s] = num[s]; else { m = (s + t) / 2; mergesort(num, s, m, num2);// 左半部分递归调用 mergesort(num, m + 1, t, num2);// 右半部分递归调用 merg(num2, s, m, t, num1);// 由num2去归并,返回的值放到num1中,num1赋新值,其实就是更新num2,然后让num2再去归并,返回新的num1 } return num1; } // 有序表的合并 private static void merg(int[] num, int l, int m, int n, int[] num1) { System.out.print("l=" + l + " m=" + m + " n=" + n); System.out.println(); int i, j, k; i = l; j = m + 1; k = l; while (i <= m && j <= n) { if (num[i] < num[j]) num1[k++] = num[i++]; else { num1[k++] = num[j++]; } } while (i <= m) { num1[k++] = num[i++]; } while (j <= n) { num1[k++] = num[j++]; } }}
(7)堆排序
package com.jp.algorithm.sort;/** * 7.堆排序-先建树,再找树根,找到根就换成叶子,再找根... * * 堆排序包括两个步骤 (1)初始堆(堆的定义:(1)堆是一个完全二叉树(2)根结点的值或者大于左右子树的值或者小于左右子树的值(3)左右子树也是一个堆) * (2)调整堆(当初始小顶堆之后,堆顶元素是最小的元素,取出最小的元素与最后一个元素相交换,再把剩下n-1个元素调整成堆,依次调整直到1为止) * 非终端节点调整 初始堆时从n/2向上调整成堆 把第一个元素与最后一个元素交换之后从第1个元素开始调整成新堆 * * @author peng.jia * */public class HeapSort { public static void main(String[] args) { int num[] = new int[] { 1, 5, 40, 32, 2, 2221 }; heapsort(num, 5); for (int x = 0; x < num.length - 1; x++) { System.out.print(num[x + 1] + " "); } } // 调整堆 public static void adjustHeap(int[] num, int s, int t) { int i = s; int x = num[s]; for (int j = 2 * i; j <= t; j = 2 * j) { if (j < t && num[j] < num[j + 1]) j = j + 1;// 找出较大者把较大者给num[i] if (x > num[j]) break; num[i] = num[j]; i = j; } num[i] = x; } public static void heapsort(int[] num, int n) { // 初始建堆从n/2开始向根调整 int i; for (i = n / 2; i >= 1; i--) { adjustHeap(num, i, n);// 初始堆过程 } for (i = n; i > 1; i--) { num[0] = num[i];// 将堆顶元素与第n,n-1,.....2个元素相交换 num[i] = num[1]; num[1] = num[0];// 从num[1]到num[i-1]调整成新堆 adjustHeap(num, 1, i - 1); } // java.util.concurrent.CopyOnWriteArrayList<E> }}
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。