• java算法每日一练2021-1-15


    1.冒泡排序

    (1)通过每一次遍历获取最大/最小值

    (2)将最大值/最小值放在尾部/头部

    (3)然后除开最大值/最小值,剩下的数据在从头进行遍历获取最大/最小值

    代码实现:

    public static void main(String[] args) {
    int test[] = {1,2,3,8,5,7};//定义数组
    //外层循环(i+1)的值相当于已经比对过得次数
    for(int i = 0; i < test.length; i++){
    /*内层循环对数值进行比较,因为每次比较都是从头开始,所以j初始值为0,
          而经过i+1次比对,数组后i+1位数据已经排好序了,所以J的最大值需要减去(i+1)*/
    for(int j = 0; j < test.length-i-1; j++){
    //进行数值比对,大的值往后挪一位
    if(test[j] > test[j+1]){
    int temp = test[j+1];
    test[j+1] = test[j];
    test[j] = temp;
    }
    }
    }
    //输出结果
    for(int k = 0; k < test.length; k++){
    System.out.println(test[k]);
    }
    }

    输出结果:

    2.选择排序

    (1)将第一个值看成最小值

    (2)然后和后面的值进行比较找出最小值和下标

    (3)交换本次遍历的起始值和最小值

    代码实现:

    public static void main(String[] args) {
    int test[] = {1,2,3,8,5,7};//定义数组
    //外层循环(i+1)的值相当于已经比对过得次数
    for(int i = 0; i < test.length; i++){
    //假设第一个值为最小值
    int min_num = test[i];
    //最小值下标
    int min_index = i;
    for(int j = i+1; j < test.length; j++){
    //如果后续有比当前最小值小的数值,进行记录,该记录为包含起始下标后所有数值的最小值数据
    if(min_num > test[j]){
    min_num = test[j];
    min_index = j;
    }
    }
    //将最小值与起始值调换数据
    int temp = test[i];
    test[i] = min_num;
    test[min_index] = temp;
    }
    //输出结果
    for(int k = 0; k < test.length; k++){
    System.out.println(test[k]);
    }
    }

    运行结果:

    3.插入排序

    从第二个数值开始,如果第二个数据比第一个小,则交换。然后在用第三个数据比较,如果比前面小,则插入。否则说明该数值亦大于之前的数值,退出内层循环。

    代码实现:

    public static void main(String[] args) {
    int test[] = {1,2,3,8,5,7};//定义数组
    //从第二个数值开始
    for(int i = 1; i < test.length; i++){
    //与前面排好队的数值进行比较插入合适位置
    for(int j = i; j > 0; j--){
    if (test[j] < test[j - 1]) {
    int temp = test[j - 1];
    test[j - 1] = test[j];
    test[j] = temp;
    } else {
    //如果大于,亦大于该数值前排好序的数值,说明插入完毕,退出内层循环
    break;
    }
    }
    }
    //输出结果
    for(int k = 0; k < test.length; k++){
    System.out.println(test[k]);
    }
    }

    运行结果:

    4.快速排序

    (1)确认列表第一个数据为中间值,第一个值看成空缺。

    (2)设置高低两个指针,开始高指针向左移动,如果遇到小于中间值的数据,则将这个数据赋值到低指针空缺,并且将高指针的数据看成空缺值。然后先向右移动一下低指针,并且切换低指针移动。当低指针移动到大于中间值的时候,赋值到高指针空缺的地方。然后先高指针向左移动,并且切换高指针移动。循环重复操作。

    (3)直到高指针和低指针相等时退出,并且将中间值赋值给该指针位置。

    (4)然后将中间值的左右两边进行快速排序。

    代码实现:

    public static void main(String[] args) {
    int test[] = {1, 2, 3, 8, 5, 7};//定义数组
    //快速排序
    int low = 0;
    int high = test.length - 1;
    quickSort(test, low, high);
    //输出结果
    for (int k = 0; k < test.length; k++) {
    System.out.println(test[k]);
    }
    }
    public static void quickSort(int[] test, int low, int high) {
    //如果高指针与低指针指向一个数值,退出
    if (high - low < 1) {
    return;
    }
    //高低指针移动的标志,true高指针false低指针
    boolean flag = true;
    //记录指针的起始位置
    int start = low;
    int end = high;
    //默认中间值为低指针的第一个值
    int midValue = test[low];
    while (true) {
    //高指针移动
    if (flag) {
    //如果列表右方的数据大于中间值,则向左移动
    if (test[high] > midValue) {
    high--;
    } else if (test[high] < midValue) {
    //如果小于,则覆盖最开始的低指针值,并且移动低指针,标志位改成从低指针开始移动
    test[low] = test[high];
    low++;
    flag = false;
    }
    } else {
    //如果低指针数据小于中间值,则低指针向右移动
    if (test[low] < midValue) {
    low++;
    } else if (test[low] > midValue) {
    //如果低指针的值大于中间值,则覆盖高指针停留时的数据,并向左移动高指针。切换为高指针移动
    test[high] = test[low];
    high--;
    flag = true;
    }
    }
    //当两个指针的位置相同时,则找到了中间值的位置,并退出循环
    if (low == high) {
    test[low] = midValue;
    break;
    }
    }
    //目前数组中间值左边的小于中间值。右边的大于中间值。
    //然后在对左右两边的列表在进行快速排序
    quickSort(test, start, low -1);
    quickSort(test, low + 1, end);
    }

    运行结果:

     

  • 相关阅读:
    ES6(二)
    ES6
    bootstrap
    数组对象
    bootstrap
    html5(二)
    css3转换、动画、布局
    整理的一些兼容写法
    css渐变、背景、过渡、分页
    css3(一)
  • 原文地址:https://www.cnblogs.com/mqlblog/p/14281358.html
Copyright © 2020-2023  润新知