冒泡排序
- 冒泡排序法是最基本的排序法之一,冒泡排序法的运行机制是通过循环遍历元素并调整相邻元素顺序来实现的一种简单排序方法。
- 假设排序是由小到大排序,冒泡算法的主要逻辑是,假设有N个数,游标从第一位数开始,若左边的数比右边的数大,则左边交换,游标移向下一位直到最后一位。在游标移动过程中,可以保证,右边的数一定比左边的数大,因为第一轮遍历是要找出最大的数,并且最大的数在最后一位。同理,要找出第二大的数,重复上述过程N-1次,直至找出第N-1大的数(不是N次循环,因为找出第N-1大的数后,第N大的数就在下标为0的位置),排序结束。因此时间复杂度是N*N,空间复杂度是N。
示例
int [] numbers = {15,58,3,69,34,22}; for(int i = 1;i<numbers.length;i++) for(int j = 0;j<numbers.length-i;j++) if(numbers[j]>numbers[j+1]) { int t = numbers[j]; numbers[j] = numbers[j+1]; numbers[j+1] = t; } for(int i : numbers) System.out.print(i+" "); System.out.println();
插入排序
- 每循环一次都将一个待排序的元素所对应的数据按其顺序大小插入到前面已经排序的序列的合适位置,直到全部插入排序完为止,其难点在于如何在前面已经排好序的序列中找到合适的插入位置。该排序方法有很多,比如直接插入排序、二分插入排序、希尔排序等等。
示例
int [] numbers_1 = {15,58,3,69,34,22}; for(int i = 1; i<numbers_1.length;i++) {//下标为0的元素默认排好序,从下标1开始 int data = numbers_1[i];//待排序的元素 for(int j = 0; j < i ; j++) { if(numbers_1[i]<numbers_1[j]) {//找到插入的位置 for(int k = i;k>j;k--)//挪位置 numbers_1[k] = numbers_1[k-1]; numbers_1[j] = data;//待排序元素插入相应位置 break; } } } for(int i : numbers_1) System.out.print(i+" "); System.out.println();
二分法查找
- 搜索数据与有序数组(比如升序)中间元素比较以确定在中间元素左边还是右边,如果在右边,则调整最小搜索索引值,然后进入下次循环;如果在左边,则调整最大搜索索引值,然后进入下次循环;如果相等则当前位置就是查找数据所在位置,停止循环;
示例
int flag = 34; int k = 0; int low = 0; int high = numbers_1.length-1; while(low<=high){ int middle = (high+low)/2; if(flag > numbers_1[middle]) low = middle+1; else if(flag < numbers_1[middle]) high = middle-1; else { k = middle; break; } } if(k!=0) System.out.println("二分法查找:"+k); else System.out.println("该数据不在数组中");