复习冒泡排序的实践
本次是学习Python而实现的算法
冒泡排序的手写实践
/** * 冒泡排序 时间复杂度 O(n^2) 空间复杂度O(1) */ public class BubbleSort { public static void bubbleSort(int[] data) { System.out.println("开始排序"); int arrayLength = data.length; for (int i = 0; i < arrayLength - 1; i++) { boolean flag = false; for (int j = 0; j < arrayLength - 1 - i; j++) { if(data[j] > data[j + 1]){ int temp = data[j + 1]; data[j + 1] = data[j]; data[j] = temp; flag = true; } } System.out.println(java.util.Arrays.toString(data)); if (!flag) break; } } public static void main(String[] args) { int[] data = { 9, -16, 21, 23, -30, -49, 21, 30, 30 }; System.out.println("排序之前:\n" + java.util.Arrays.toString(data)); bubbleSort(data); System.out.println("排序之后:\n" + java.util.Arrays.toString(data)); } }
二分查找的使用
/** * 二分查找 时间复杂度O(log2n);空间复杂度O(1) */ def binarySearch(arr:Array[Int],left:Int,right:Int,findVal:Int): Int={ if(left>right){//递归退出条件,找不到,返回-1 -1 } val midIndex = (left+right)/2 if (findVal < arr(midIndex)){//向左递归查找 binarySearch(arr,left,midIndex,findVal) }else if(findVal > arr(midIndex)){//向右递归查找 binarySearch(arr,midIndex,right,findVal) }else{//查找到,返回下标 midIndex } } 拓展需求:当一个有序数组中,有多个相同的数值时,如何将所有的数值都查找到。 代码实现如下: /* {1,8, 10, 89, 1000, 1000,1234} 当一个有序数组中,有多个相同的数值时,如何将所有的数值都查找到,比如这里的 1000. //分析 1. 返回的结果是一个可变数组 ArrayBuffer 2. 在找到结果时,向左边扫描,向右边扫描 [条件] 3. 找到结果后,就加入到ArrayBuffer */ def binarySearch2(arr: Array[Int], l: Int, r: Int, findVal: Int): ArrayBuffer[Int] = { //找不到条件? if (l > r) { return ArrayBuffer() } val midIndex = (l + r) / 2 val midVal = arr(midIndex) if (midVal > findVal) { //向左进行递归查找 binarySearch2(arr, l, midIndex - 1, findVal) } else if (midVal < findVal) { //向右进行递归查找 binarySearch2(arr, midIndex + 1, r, findVal) } else { println("midIndex=" + midIndex) //定义一个可变数组 val resArr = ArrayBuffer[Int]() //向左边扫描 var temp = midIndex - 1 breakable { while (true) { if (temp < 0 || arr(temp) != findVal) { break() } if (arr(temp) == findVal) { resArr.append(temp) } temp -= 1 } } //将中间这个索引加入 resArr.append(midIndex) //向右边扫描 temp = midIndex + 1 breakable { while (true) { if (temp > arr.length - 1 || arr(temp) != findVal) { break() } if (arr(temp) == findVal) { resArr.append(temp) } temp += 1 } } return resArr }
快排的使用
** * 快排 * 时间复杂度:平均时间复杂度为O(nlogn) * 空间复杂度:O(logn),因为递归栈空间的使用问题 */ def quickSort(list: List[Int]): List[Int] = list match { case Nil => Nil case List() => List() case head :: tail => val (left, right) = tail.partition(_ < head) quickSort(left) ::: head :: quickSort(right) }
归并排序的实践
/** * 快排 * 时间复杂度:O(nlogn) * 空间复杂度:O(n) */ def merge(left: List[Int], right: List[Int]): List[Int] = (left, right) match { case (Nil, _) => right case (_, Nil) => left case (x :: xTail, y :: yTail) => if (x <= y) x :: merge(xTail, right) else y :: merge(left, yTail) }