简单排序
一、排序算法
分类:内部排序和外部排序
二、冒泡排序
解析: 相邻的进行比较,大的向后移动;
每一趟排序后,比较的次数会减一;
如果在某趟排序中没有发生交换,则可以提前结束;
public class BubbleSort { public static void main(String[] args) { int[] arr = {3, -1, 9, 10, -2}; sortArr1(arr); System.out.println(Arrays.toString(arr)); } /** * 冒泡排序 * * @param arr */ public static void sortArr1(int[] arr) { int temp = 0; boolean flag = false; //判断是否发生交换 for (int i = arr.length - 1; i > 0; i--) { // 从本数组来看i最大为4;j最大为3 // 一次循环为一趟排序 for (int j = 0; j < i; j++) { if (arr[j] > arr[j + 1]) { flag = true; temp = arr[j]; arr[j] = arr[j + 1]; arr[j + 1] = temp; } } if (!flag) { break; // 一趟排序完为false,则已经排好序 } else { flag = false; // 若为true,则发生交换,还未完成,置为true; } } }
三、选择排序
选择排序是:第一次从a[0]~a[n-1]中找出最小的数,与a[0]交换,每次只交换一次;以此类推;在第n-1次从a[n-2]~a[n-1]中找到最小的和a[]
找到最小的方法:假设第一个为最小,和其他的挨个比较;
1 public class BubbleSort { 2 public static void main(String[] args) { 3 int[] arr = {3, -1, 9, -8, 10, 5,4,9 ,-2}; 4 sortArr2(arr); 5 System.out.println(Arrays.toString(arr)); 6 } 7 8 /** 9 * 选择排序 10 */ 11 public static void sortArr2(int[] arr) { 12 13 for (int i = 0; i < arr.length - 1; i++) { 14 int min = arr[i]; //假设最小值为arr[0] 15 int minIndex = i; // 记录下标 16 for (int j = i+1; j < arr.length; j++) { 17 if (min > arr[j]) { 18 min = arr[j]; // 将小的值赋给min 19 minIndex = j; 20 } 21 } 22 // 一趟循环完成,将最小值和arr[0]交换
if (minIndex != i) {
23 arr[minIndex] = arr[i]; 24 arr[i] = min;
} 25 } 26 } 27 }
四、插入排序
原理:1.把所有的元素分为两组,已排序和未排序
2.找到未排序的组中的第一个元素,向已经排序的组中进行插入
3.倒叙遍历已经排序的元素,依次和待插入的元素进行比较,直到找到一个元素小于等于待插入元素,就把待插入元素放到此位置,其他元素后移
/** * 插入排序1 */ public static void sortArr3(int[] arr) { int temp = 0; for (int i =1;i<arr.length;i++) { // 开始插入时,第一个数假定已经有序,从第二个数开始向后为无序,每次将无序中第一个数插入到有序中; for (int j=i; j>0;j--) { if (arr[j]<arr[j-1]) { temp = arr[j]; arr[j] = arr[j-1]; arr[j-1] = temp; } } } } /** * 插入排序(优化) */ public static void sortArr4(int[] arr) { for (int i = 1; i<arr.length; i++) { int insertVal = arr[i]; // 将要插入的元素取出,然后和它前面的元素挨个比较 int insertIndex = i - 1; // 要插入元素的前一个的下标 while (insertIndex >= 0 && insertVal < arr[insertIndex]) { arr[insertIndex + 1] = arr[insertIndex]; // 如果insertVal小于它前面的元素,将前面的元素后移 insertIndex--; // 前移,指向前一个位置 } // 等于i时相当于没又动 if (insertIndex + 1 != i ) { arr[insertIndex + 1] = insertVal; // 比较完成之后,将要插入的元素,插入位置 } } }