算法学习笔记 第1章 排序
来源:互联网 发布:sql不区分大小写查询 编辑:程序博客网 时间:2024/06/13 01:43
目录:
- 冒泡排序
- 桶排序
- 快速排序
第1章主要讲了桶排序,冒泡排序和快速排序。
+ 桶排序最快最简单,冒泡排序是入门级排序,快速排序是最常用的排序。
+ 时间复杂度:桶排序O(N+M),快速排序O(NlogN),冒泡排序O(N^2)。
冒泡排序
- 冒泡排序的基本思想:每次比较两个相邻的元素,如果它们的顺序错误(与我们设定的不同)就将它们交换过来。
- 如果是从大到小排序,就是越小的越靠后。
- 冒泡排序代码的核心部分是双重嵌套循环。
- 冒泡排序的步骤:
- 如果有n 个数进行排序,只需将n-1 个数归位,也就是说要进行n-1 趟操作;
- 而“每一趟”都需要从第1 位开始进行相邻两个数的比较,将较小的一个数放在后面,比较完毕后向后挪一位继续比较下面两个相邻数的大小;
- 重复此步骤,直到最后一个尚未归位的数,已经归位的数则无需再进行比较。
- 冒泡排序代码演示:
import java.util.Arrays;import java.util.Random;/** * <p>Description:冒泡排序算法</p> * <p>2016年8月5日 下午5:16:35</p> * @author wdk * @version 1.0 */public class BubbleSort { private final static int LENGTH = 10;//数组长度 private final static int BOUND = 1000;//随机数边界值[0,BOUND) public static void main(String[] args) { Random random = new Random(); int[] arr = new int[LENGTH]; for (int i = 0; i < arr.length; i++) { arr[i] = random.nextInt(BOUND); } System.out.println("排序前:"+Arrays.toString(arr)); System.out.println("用冒泡排序(从大到小排列):"); long beginTime = System.currentTimeMillis(); bubbleSort(arr);//冒泡排序算法 System.out.println("排序后:"+Arrays.toString(arr)); long endTime = System.currentTimeMillis(); System.out.println("冒泡排序耗时:"+(endTime- beginTime)+"ms"); } /** * 冒泡排序算法 * @param arr */ static void bubbleSort(int[] arr){ for (int i = 0; i < arr.length - 1; i++) { for (int j = 0; j < arr.length - i -1; j++) { if(arr[j] < arr[j+1]){ int temp = arr[j]; arr[j] = arr[j+1]; arr[j+1] = temp; } } } }}
桶排序
- 桶排序的步骤:
- 需要排序多少个数,就申请多少个数组(“桶”)。
- 扫描全部的数,每遇到与数组索引(就是arr[index]中的index)相同的,则该值(arr[index])加1。
- 再遍历数组打印所有的值。从小到大用for(i=0;i<=10;i++) 从大到小用for(i=10;i>=0;i–)
快速排序
- 思想:
- 需要将这个序列中所有比基准数大的数放在基准数的右边,比基准数小的数放在基准数的左边。
- 目标就是将基准数移到中间的某个位置(设为k),寻找位置k,使得以第k位为分界点,左边数小于基准数,右边数大于基准数。
- 步骤
- 在序列中随机找一个基准数(例如最左边的数);
- 设定2个”哨兵” i 和 j,分别指向序列的最左边和最右边;
- 先让j不断向左移动(j–),找到小于基准数的数时停下来;再让i不断向右移(i++),找到大于基准数的数时停下来。
- 现在交换i和j所指向的值,第一次交换结束;
- 重复步骤3,4直至i与j碰头,将该指向值与基准数交换,则基准数位于分界点(第k位)位置,至此完成第一次分界点的寻找;
- 再分别对分界点左右序列,重复以上所有步骤,完成后续分界点的寻找,直至排序完成。
1 0
- 算法学习笔记 第1章 排序
- 算法学习导论学习笔记-第6章 堆排序
- 算法导论学习笔记-第7章 快速排序
- 算法导论学习笔记-第8章 线性时间排序
- 算法导论学习笔记 第6章 堆排序
- 算法导论学习笔记 第7章 快速排序
- 《算法(第4版)第2章:排序》学习笔记
- 算法学习笔记----第二部分:排序和顺序统计量----第6章、堆排序
- 排序算法学习笔记
- 排序算法学习笔记
- 算法学习笔记-排序
- 排序算法学习笔记
- 排序算法学习笔记
- 排序算法学习笔记
- 排序算法学习笔记
- 《算法导论》笔记 第6章 6.4堆排序算法
- 【算法学习笔记】-排序算法
- 算法入门经典 第1,2章学习笔记
- Android中的三种XML解析方式
- session监听器
- 单链表——来点基础的
- 如何知道手机屏幕的CSS像素宽度?
- Ubuntu Linux系统下设置静态IP的方法
- 算法学习笔记 第1章 排序
- 很简单就实现垂直滑动的ViewPager
- 我对 Sidekiq 的理解
- 【NOIP提高】自然数
- ListView的item中有button ImageButton CheckBox EditText等时 点击事件失效问题的解决
- iOS textField输入数字时每隔3个数字就用逗号隔开
- Tyvj 1066 合并果子(贪心)
- Android Studio五分钟带你从菜鸟到高级调试
- html5 + css 学习小结