便于自己复习和查阅,特记录一下。
1.冒泡排序(升序)
思路:每一轮将连续两个数比较大小,如果后面的大于前一个,进行交换,每一轮冒泡均能找到一个最大的值;
然后,比较的轮数是length-1-i,解释如下:每一轮产生的最大的都是固定的,所以要减去已经有序的个数,-1的意思是,i只循环到最后一个的前一个,与后一个进行比较就行了
1 public static void bubbleSort(int[] array) {//冒泡排序 2 int temp; 3 for (int i = 0; i < array.length; i++) {//轮数 4 for (int j = 0; j < array.length - i - 1; j++) {//每一轮比较的个数 5 if (array[j] > array[j + 1]) { 6 temp = array[j + 1]; 7 array[j + 1] = array[j]; 8 array[j] = temp; 9 } 10 } 11 } 12 }
2.快速排序算法(用递归)
思路:找到一个基准值,一般用第一个值记为key,根据key的大小,将待排序元素分成两组,左边的数都小于key,中间为key,右边的值均大于key;
用左右数组下标进行查找记i,j,先从后往前找找到第一个小于key的值,将i 对应的值覆盖,然后i++,向后找,找到第一个大于key的值,将j 对应值覆盖,最后找到基准值的为值,将key放入。然后进行递归。
public static void qucikQuery(int[] array, int left, int right) {//快排 递归实现 int key = array[left];//用来保存第i个值; int i = left; int j = right; if (left >= right) { return; } while (i < j) { while (i < j && array[j] > key) j--; if (i < j) {//找到第一个大于key的值,进行交换 array[i] = array[j]; } while (i < j && array[i] < key) i++; if (i < j) { array[j] = array[i]; } } array[i] = key; qucikQuery(array, left, i - 1); qucikQuery(array, i + 1, right); }
另一种快速排序
public static void quickSort(int[] a, int left, int right) { if (left > right) return; int pivot = a[left];//定义基准值为数组第一个数 int i = left; int j = right; while (i < j) { while (pivot <= a[j] && i < j)//从右往左找比基准值小的数 j--; while (pivot >= a[i] && i < j)//从左往右找比基准值大的数 i++; if (i < j) //如果i<j,交换它们 { int temp = a[i]; a[i] = a[j]; a[j] = temp; } } a[left] = a[i]; a[i] = pivot;//把基准值放到合适的位置 quickSort(a, left, i - 1);//对左边的子数组进行快速排序 quickSort(a, i + 1, right);//对右边的子数组进行快速排序 }
后续,会继续补充。