Jimmy小站
小明也有大梦想 — 蒋明/铭冒泡排序,选择排序,插入排序,希尔排序
2016-03-23 / 数据结构算法 / 3615 次围观 / 1 次吐槽几种简单的排序算法,记录在博客中,主要学习下其中的思想。
冒泡排序
(遍历下标 0 -> i) 将相邻两个元素比较
将较大的放到后面,直到下标为 i ,即表明下标 i 及以后的元素排序完成
再次(遍历下标 0 -> i-1)
再次(遍历下标 0 -> i-2)
......
直到剩下最后一个元素
package net.jimmyme; import java.util.Arrays; public class BubbleSort { public static int source[] = {101,8,9,13,45,17,26,99,78,11,46}; public static void main(String[] args) { bubbleSort(); System.out.println(Arrays.toString(source)); } public static void bubbleSort(){ for (int i = 0; i < source.length; i++) { for (int j = 0; j < source.length-1-i; j++) { if (source[j] > source[j+1]) { int temp = source[j+1]; source[j+1] = source[j]; source[j] = temp; } } } } }
选择排序
遍历下标 0 -> n 选出最小的元素(下标为 i)
交换 下标为 0 与 i 的元素
再次(遍历下标 1 -> n) 选出最小的元素(下标为 i)
交换
......
直到剩下最后一个元素
package net.jimmyme; import java.util.Arrays; public class SelectSort { public static int source[] = {101,8,9,13,45,17,26,99,78,11,46}; public static void main(String[] args) { selectSort(); System.out.println(Arrays.toString(source)); } public static void selectSort(){ for (int i = 0; i < source.length; i++) { int min = i; for (int j = i+1; j < source.length; j++) { // find the index of min value if (source[j] < source[min]) { min = j; } } //swap int temp = source[i]; source[i] = source[min]; source[min] = temp; } } }
插入排序
第0位元素保持不动,从第一位开始,将选取的元素与已经有序的序列对比
找到前面小于等于 该元素 后面大于等于该元素的位置
将该元素 插入两者之间
直到所有元素都插入
package net.jimmyme; import java.util.Arrays; public class InsertSort { public static int source[] = {101,8,9,13,45,17,26,99,78,11,46}; public static void main(String[] args) { insertSort(); System.out.println(Arrays.toString(source)); } public static void insertSort(){ for (int i = 1; i < source.length; i++) { int temp = source[i]; //选中第i个元素 int j = i-1; // 从第i-1元素开始 往前找 只要比temp大就往后移 while (j >= 0 && source[j] > temp) { source[j+1] = source[j]; j--; } // 直到找到前面一个比自己小,后一个就是该元素的位置 source[j+1] = temp; } } }
希尔排序
希尔排序就是插入排序的优化版本,将步长定为 d ,分成 d 个组,每个组进行插入排序,经过一轮之后 逐步缩短步长 d 。直到步长变为1(标准插入排序)
package net.jimmyme; import java.util.Arrays; public class ShellSort { public static int source[] = {101,8,9,13,45,17,26,99,78,11,46}; public static void main(String[] args) { shellSort(); System.out.println(Arrays.toString(source)); } public static void shellSort(){ int d = source.length/2; while (d > 0) { // 相当于步长为d的插入排序法,且步长逐渐缩小,当步长为1时 就是标准的插入排序 for (int i = d; i < source.length; i++) { int j = i-d; int temp = source[i]; while (j >= 0 && source[j] > temp) { source[j+d] = source[j]; j -= d; } source[j+d] = temp; } d /= 2; } } }
本月热文
Copyright © Jimmy小站 Allrights Reserved.备案号:桂ICP备 15005996
已有1位网友发表了看法:
发表评论