基本排序算法

来源:互联网 发布:linux终端全屏 编辑:程序博客网 时间:2024/06/03 17:01

  排序算法有很多,保持每天更新写一个,有时间会写多个。

一、冒泡排序算法

 

<span style="font-size:14px;">/** * 冒泡排序 从小到大 * 算法思想: *         将两个相邻的数据相比较(这里是从小到大排序), 如果后一个大于前一个就交换其值, *         每一次经过遍历后就会比较出一个最大值,该最大值会被交换到最右边(相对于此次遍历而言) *         每次遍历只能比较出一个“最大值”(相对于此次遍历而言),假设一个数组长度为n,那么需要遍历n-1次 *         才可以完全排序完,因此使用两层for循环,可以看出来,写多层循环的时候 * @param arr *            源数组,待排序 * @return */public static int[] bubbleSort(int[] arr) {System.out.println("冒泡排序(从小到到):");//这个for循环没遍历一次,就会将一个最大值放在“最右边”//如果是从大到小排序则每次遍历后就会将一个最小的值排到“最左边”for (int i = 0;i<arr.length-1;i++) {for (int j = 0; j < arr.length-1-i; j++) {//实现从大到小只需要将>改成<即可,if (arr[j] > arr[j +1]) {int temp = arr[j];temp = arr[j];arr[j] = arr[j+1];arr[j+1] = temp;}}}return arr;}</span>


二、快速排序

  

// ==================== 快速排序 ========================///** * 快速排序算法思想: 首先选取一个基准元素,通常那个是选取数组第一个元素或是最后一个元素(相对于此次遍历来说)。 *           通过一趟排序将要排序的数据分割成独立的两部分, *           其中一部分的所有数据都比另外一部分的所有数据都要小, *           然后再按此方法对这两部分数据分别进行快速排序, *           整个排序过程可以递归进行,以此达到整个数据变成有序序列。           *  * @param a * @return */private static int[] quick(int[] a) {if (a.length > 0) {quickSort(a, 0, a.length - 1);}return a;}private static void quickSort(int[] a, int low, int high) {if (low < high) { // 如果不加这个判断递归会无法退出导致堆栈溢出异常int middle = getMiddle(a, low, high);quickSort(a, 0, middle - 1);quickSort(a, middle + 1, high);}}private static int getMiddle(int[] a, int low, int high) {// 选取基准元素int temp = a[low];//while (low < high) {// 找到比基准元素小的元素位置// 从最右边开始将每一个元素和基元素比较,如果该元素比基准元素要大,那么就左移动一位继续进行比较// 如果恰好temp为最小的元素,那么这个while会执行high次知道high和low相等。while (low < high && a[high] >= temp) {high--;}// 如果遍历时发现有比基元素更小的就赋值给基准元素,这个low和high可能会相等。a[low] = a[high];// 这个循环不执行的条件是:所选取的基准元素恰好是最小的元素,那么此时low和hignt是相等的,// 因为在上一个while循环中hight做--运算。while (low < high && a[low] <= temp) {low++;}a[high] = a[low];}a[low] = temp;return low;}



0 0
原创粉丝点击