目录
冒泡排序是众多排序的一种,无论在C语言或者Java中都很常见,后续在数据结构中也会用到
(1)冒泡排序思想
(2)冒泡排序场景
(1)完成排序需要的内容
(2)排序的过程解析
我们将下面数组排序成升序
int[] arr = {10,9,8,7,6,5,4,3,2,1};
后续的排序趟数是类似的,接下来我们总结一下规律
- int i =0;
- for (i = 0; i < arr.length-1; i++) {
-
- for (int j = 0; j < arr.length-1-i; j++) {
- //可自己设置条件条件
- if(arr[j]>arr[j+1]) {
- //完成两个数字的交换
- int tmp = arr[j+1];
- arr[j+1] = arr[j];
- arr[j] = tmp;
- }
- }
- }
- import java.util.Arrays;
-
- public class Sort{
- public static void main(String[] args) {
- //冒泡排序
- int[] arr = {10,9,8,7,6,5,4,3,2,1};
- bubbleSort(arr);
- System.out.println(Arrays.toString(arr));
-
- }
- public static void bubbleSort(int[] arr) {
- //升序
- int i =0;
- for (i = 0; i < arr.length-1; i++) {
-
- for (int j = 0; j < arr.length-1-i; j++) {
- if(arr[j]>arr[j+1]) {
- int tmp = arr[j+1];
- arr[j+1] = arr[j];
- arr[j] = tmp;
-
- }
- }
- }
- }
- }
(1)折半查找,又称二分查找。
(2)二分查找每次都是从中间位置开始查找,因此称为折半查找(二分查找)
(3)可以进行二分查找的条件
(1)方法的参数写法
- public static int binarySearch(int[] arr,int k) {
-
- }
(2)查找的内部细节
- public static int binarySearch(int[] arr,int k) {
- int left = 0;
- int right = arr.length-1;
- }
int mid = (left+right)/2;
(3)二分查找的过程解析
- public static int binarySearch(int[] arr,int k) {
- int left = 0;
- int right = arr.length-1;
- while(left <= right) {
- //从中间位置开始找
- int mid = (left+right)/2;
- if(k < arr[mid]) {//k在左边
- right=mid-1;
- } else if(k > arr[mid]) {
- //在右边
- left=mid+1;
- } else {
- return mid;
- }
- }
- return -1;
- }
- public static void main(String[] args) {
- //1.折半查找,要求数组内容为有序.找到了返回下标
- int[] arr1 = {2,5,7,8,10,11,15,17,20,22};
- int ret = binarySearch(arr1,10);
- System.out.println(ret);
- //2.当数组无序时,使用Array.sort排序后折半查找
- int[] arr2 = {9,8,7,6,5,4,3,2,1,0};
- Arrays.sort(arr2);
- System.out.println(Arrays.toString(arr2));
- int cur = binarySearch(arr2,11);
- System.out.println(cur);
- }
- public static int binarySearch(int[] arr,int k) {
- int left = 0;
- int right = arr.length-1;
- while(left <= right) {
- //从中间位置开始找
- int mid = (left+right)/2;
- if(k < arr[mid]) {//k在左边
- right=mid-1;
- } else if(k > arr[mid]) {
- //在右边
- left=mid+1;
- } else {
- return mid;
- }
- }
- return -1;
- }
(1)要求将数组内容逆序,不是逆序打印
int[] arr = {10,9,8,7,6,5,4,3,2,1,0};
(2)设置头尾位置
- public static void reverse(int[] arr) {
- int left = 0;//头位置
- int right =arr.length-1;//尾位置
- }
这样是为了从两头开始交换数据
(3)循环交换数据
- while(left < right) {//相等的时候就不需要逆序了
- int tmp = arr[left];
- arr[left] = arr[right];
- arr[right] = tmp;
- left++;
- right--;
- }
内部代码其实就是实现两个数的交换;当left==right的时候,就是只剩下一个数据没有完成交换了,其实也就不需要再交换了(非要交换也行)
- public static void main(String[] args) {
- //逆序数组
- int[] arr = {10,9,8,7,6,5,4,3,2,1,0};
- reverse(arr);
- System.out.println(Arrays.toString(arr));
- }
- public static void reverse(int[] arr) {
- int left = 0;
- int right =arr.length-1;
- while(left < right) {//相等的时候就不需要逆序了
- int tmp = arr[left];
- arr[left] = arr[right];
- arr[right] = tmp;
- left++;
- right--;
- }
-
- }