关于冒泡排序
大体思想就是对于一队数字,相邻数字通过比较两两交换,实现从小到大或者从大到小排列。利用两个for循环实现,执行内层for循环可以理解为进行一趟比较,每次比较都可以从无序序列中将一个max或者min值交换到首或者尾(想从大到小排列,就每次比较的时候将较小的[i]交换至[i+1]处,反之同理),外层for循环就是执行数趟,直到全部比较结束(添加flag做标志的话就可以减少一些比较次数,在数列第一次基本有序时就跳出循环~)
import java.util.Arrays; public class MaoPao { public static void main(String[] args) { MaoPao maoPao = new MaoPao(); int[] a= {23,46,1,89,43,22,23,44,3}; //maopaosort(a); int [] maopaosort = maoPao.maopaosort(a); //System.out.println(Arrays.toString(maopaosort));//可以直接输出数组 //或者用循环 for (int num: maopaosort) { System.out.print(num+"\t"); } } public int [] maopaosort(int [] b) { int temp = 0; for (int i = 0; i < b.length - 1; i++) { int flag = 0;//标记无序 for (int j = 0; j < b.length - 1 - i; j++) { if (b[j] >= b[j + 1]) {//若左大右小,则data交换 temp = b[j]; b[j] = b[j + 1]; b[j + 1] = temp; flag = 1;//标记有序 } } if (flag == 0) {//完成某趟排序后发现已经基本有序,就跳出 break; } } return b; } }
关于简单选择排序
思想:每一趟都能找出一个当前最小值,比如第一趟找到的最小值放在a[0],第二趟找到的次小值就放在a[1],以此类推,这种算法在数列中有相同关键字有序的时候很不稳定,因为交换后会破坏原有关键字的前后顺序,比如1,3,3,2, ,3和2比较,如果有多个3就只能把第一个3换过去,排序后:1,2,3,3 但是原来的 3,3变为3,3,相对位置改变了,现在前后颠倒(虽然看起来一样hh)
public class SelectSort{ public int[] sort(int arr[]) { int temp = 0; for (int i = 0; i < arr.length - 1; i++) { // 认为目前的数就是最小的, 记录最小数的下标 int minIndex = i; for (int j = i + 1; j < arr.length; j++) { if (arr[minIndex] > arr[j]) { // 修改最小值的下标 minIndex = j; } } // 当退出for就找到这次的最小值,就需要交换位置了 if(i != minIndex) { temp = arr[i]; arr[i] = arr[minIndex]; arr[minIndex] = temp; } } return arr; } public static void main(String[] args) { SelectSort selectSort = new SelectSort(); int[] array = {2,5,1,6,4,9,8,5,3,11,2,0}; int[] sort = selectSort.sort(array); for (int num:sort){ System.out.print(num+"\t"); } } }
关于直接插入排序
思想:虽然叫直接插入但并不涉及手动插入,而是像整理扑克牌一样,一般我们都习惯将牌升序或者降序排列来方便出牌(也有人会用别的方法,我就是举个栗子)
发牌后发现基本都是乱序,假设我们从左开始理牌,想要让牌从小到大排列。依然是比较思想,先用第二张和第一张比较,然后就是第三张和前两张比较,看起来和选择排序有些像,
用例子说明:
发牌后手中牌:2,6,3,1,13,7,2
第一趟:2,6,3,1,13,7,2 无交换
第二趟:2,3,6,1,13,7,2 3和6交换
第三趟:1,2,3,6,13,7,2 1先和6交换,然后发现1还可以和3交换,交换后,又双叒发现能和2交换,于是就是第三趟排序后就是前面那样子;
第四趟:1,2,3,6,13,7,2 无交换
第五趟:1,2,3,6,7,13,2 7和13交换
第六趟:1,2,2,3,6,7,13 2和13交换,然后2又和7,交换,....交换............最后和3交换,完成排序
所以,和选择排序还是很有区别的,选择排序是只找当前最小值,然后不断放在序列头部,直接插入虽然也是头部有序,但并不一定是每一趟都能固定好关键字的位置,
简单选择每趟排序都能确定一个关键字的位置,直到最后一趟结合素其位置都不会改变,这点我记得在数据结构中会经常考察。
public class InsertSort { private int[] sort(int[] arr) { //如果传入的数组为空或者只有一个值,就直接返回 if (arr == null || arr.length < 2) { return arr; }//不为空则进循环判断 // 外层循环控制总数量 for (int i = 1; i < arr.length; i++) { //内层循环依次减少并提出结果 for (int j = i; j > 0; j--) { //如果当前数字小于前一个,则交换,否则不变 if (arr[j] < arr[j - 1]) { int temp = arr[j]; arr[j] = arr[j - 1]; arr[j - 1] = temp; } else { break; } } } return arr; } public static void main(String[] args) { InsertSort insertSort = new InsertSort(); int[] array = {2, 5, 1, 6, 4, 9, 8, 5, 3, 1, 2, 0}; int[] sort = insertSort.sort(array); for (int num : sort) { System.out.print(num + "\t"); } } }