189 8069 5689

(冒泡、选择、插入和希尔)排序的内容-创新互联

排序
  • 排序规则
  • 一、冒泡排序
    • 1.BubbleSort-代码呈现
    • 2.BubbleSort-代码优化
  • 二、选择排序
    • SelectionSort-代码呈现
  • 三、冒泡与选择排序比较
  • 四、插入排序
    • InsertSort-代码呈现
  • 四、插入排序与选择排序的比较
  • 五、希尔排序
  • 总结

让客户满意是我们工作的目标,不断超越客户的期望值来自于我们对这个行业的热爱。我们立志把好的技术通过有效、简单的方式提供给客户,将通过不懈努力成为客户在信息化领域值得信任、有价值的长期合作伙伴,公司提供的服务项目有:国际域名空间、虚拟空间、营销软件、网站建设、漠河网站维护、网站推广。
排序规则

  排序就是将一组对象按照某种逻辑顺序重新排列的过程。主要关注的排序算法是对数组元素而言的排序算法。排序的目的是使数组正序索引的元素也是正序或逆序的。


一、冒泡排序

  相邻两个元素进行比较,前一个小于后一个位置不动,前一个大于后一个,位置互换。

1.BubbleSort-代码呈现
public class BubbleSort {public static void main(String[] args) {int[] a = new int[]{5, 9, 7, 4, 1, 3, 2, 8};
        bubble(a);
    }

    public static void bubble(int[] a) {for(int j = 0; j< a.length - 1; ++j) {for(int i = 0; i< a.length - 1; ++i) {if (a[i] >a[i + 1]) {swap(a, i, i + 1);
                }
            }

            System.out.println("第" + j + "轮冒泡" + Arrays.toString(a));
        }

    }

    public static void swap(int[] a, int i, int j) {int t = a[i];
        a[i] = a[j];
        a[j] = t;
    }
}

代码运行效果:
在这里插入图片描述

2.BubbleSort-代码优化

  由上述的方法,可以知道不是程序最优的方式,有以下两种方法可以改进程序的运行效率:

  ①比较次数是可以逐级递减的,利用外层j不断增长,减少内层循环的比较次数

public static void bubble(int[] a){for (int j = 0; j< a.length-1; j++) {for (int i = 0; i< a.length-1-j; i++) {System.out.println("比较次数"+i);
                if (a[i] >a[i + 1]) {swap(a, i, i + 1);
                }
            }
            System.out.println("第"+j+"轮冒泡"+Arrays.toString(a));
        }
    }

在这里插入图片描述

  ②减少不必要的冒泡次数,判断什么时候数组有序(判断是否发生交换)

public static void bubble(int[] a){boolean swapped=false;//是否发生交换
        for (int j = 0; j< a.length-1; j++) {for (int i = 0; i< a.length-1-j; i++) {System.out.println("比较次数"+i);
                if (a[i] >a[i + 1]) {swap(a, i, i + 1);
                    swapped=true;
                }
            }
            System.out.println("第"+j+"轮冒泡"+Arrays.toString(a));
            if (!swapped){break;
            }
        }
    }

在这里插入图片描述

二、选择排序

  选择出最小的元素,把最小的元素放在最前面,使数组有序。

SelectionSort-代码呈现
public class SelectionSort {public static void main(String[] args) {int[] a={5,3,7,2,1,9,8,4};
        selection(a);
    }
    public static void selection(int[] a){for (int i = 0; i< a.length-1; i++) {//i 代表每轮选择最小元素要交换到的目标索引
            int s=i;//代表最小元素的索引
            for (int j = s+1; j< a.length; j++) {if(a[s]>a[j]){s=j;
                }
            }
            if(s!=i){swap(a,s,i);
            }
            System.out.println(Arrays.toString(a));
        }
    }
    public static void swap(int[] a,int i,int j){int t=a[i];
        a[i]=a[j];
        a[j]=t;
    }
}

以上代码已优化:为减少交换次数,每一轮可以先找最小的索引,在每轮最后再交换元素。
代码运行结果:
在这里插入图片描述

三、冒泡与选择排序比较

  ①二者平均时间复杂度都是O(n^2)
  ②选择排序一般要快于冒泡,因为其交换次数少
  ③但如果集合有序度高,冒泡优于选择
  ④冒泡属于稳定排序算法,而选择属于不稳定排序

四、插入排序

  分成未排序和排序区域,从未排序中取一个元素,相互比较,将值插入到空出的排序区域。

InsertSort-代码呈现
public class InsertSort {public static void main(String[] args) {int[] a={9,3,7,2,5,8,1,4};
        insert(a);
    }
    public static void insert(int[] a){//i 代表待插入元素的索引
        for (int i = 0; i< a.length; i++) {int t=a[i];//代表待插入的元素值
            int j=i-1;//代表已排序区域的元素索引
            while (j>=0){if(ta[j+1]=a[j];
                }else {break;//退出循环,减少比较次数
                }
                j--;
            }
            a[j+1]=t;
            System.out.println(Arrays.toString(a));
        }
    }
}

优化方式:待插入元素进行比较,遇到比自己小的元素,就代表找到插入位置,无需进行后续比较。
代码运行结果:
在这里插入图片描述

四、插入排序与选择排序的比较

  ①二者平均时间复杂度都是O(n^2)
  ②大部分情况下,插入都略优于选择
  ③有序集合插入的时间复杂度为O(n)
  ④插入属于稳定排序算法,而选择属于不稳定排序。

五、希尔排序

  把间隙相同的元素划为一组,同组中使用插入排序,直到间隙为1时,整体排序完成。

总结

  冒泡排序:(升序为例)依次比较数组中相邻两个元素的大小,若a[i]>a[i+1],则交换两个元素,两两都比较一遍称为一轮冒泡,结果是让大的元素排至最后;重复以上的步骤,直到整个数组有序。
  选择排序:(升序为例)将数组分为两个子集,排序的和未排序的,每一轮从未排序的子集中选出最小的元素,放入排序子集中;重复以上步骤,直到整个数组有序。
  插入排序:(升序为例)将数组分为两个区域,排序区域和未排序区域,每一轮从未排序区域中取出第一个元素,插入到排序区域(需保证顺序);重复以上步骤,直到整个数组有序。

你是否还在寻找稳定的海外服务器提供商?创新互联www.cdcxhl.cn海外机房具备T级流量清洗系统配攻击溯源,准确流量调度确保服务器高可用性,企业级服务器适合批量采购,新人活动首月15元起,快前往官网查看详情吧


文章题目:(冒泡、选择、插入和希尔)排序的内容-创新互联
转载注明:http://cdxtjz.cn/article/csigdc.html

其他资讯