冒泡排序和选择排序以及选择排序的优化
2017-05-02 08:10
381 查看
冒泡排序:两个相邻的数据两两相比,如果是从小到大排列,将较大的数据换位到较小数后面,这样第一轮结束,最后一个数据是最大的数据,因为总是把较大的数据换到后面,再进行第二轮,第三轮(此时已经排好序的数据可以不再参与排序,提高效率)......当第二个数据确定时,第一个数据也就确定了,排序结束。大圈套小圈思想,外层循环控制次数,内层循环控制比较的数据。
选择排序和冒泡会用到数据的位置交换,所以为了提高代码复用性,我们先写一段数据位置交换的代码: public static void swap (int[] arr,int a,int b){
int temp=arr[a];
arr[a]=arr[b];
arr[b]=temp;
} 以下是冒泡排序;
以下是选择排序:
public static void choosePaiXu(int [] arr){
for (int x=0;x<arr.length-1 ;x++ ) { //这里 -1 当倒数第二个位置的数据确定,最后一个位置的数据也就确定了
for (int y=x+1; y<arr.length;y++ ) { //这里 y=x+1,0-x是排过序的位置,x+1是指从尚未排序的位置开始确定数据的值
if (arr[x]>arr[y]) { //判断两个数据的大小(将较小的数据放在要确定的位置上)
swap(arr,x,y); //调用swap方法完成两个数据交换位置
}
}
}
} 写选择排序的时候我们发现,当确定一个位置的时候,只要是发现了比这个位置上的数据更小的数据,我们就要调用swap方法进行两个数据的交换,来达到这个位置上的数据保持在最小,可是这样并不是最优的做法,因为每一次交换就要重新申请临时变量,这样代码的效率比较低。所以我们可以用两个变量来记录较小值的数据和下标,每一次比较是和这个变量比,遇到更小的值就赋值给变量,当比较完之后,这个两个变量记录的就是最小值的数据和下标。此时只需要将最小值的数据与要排位置的数据交换即可。
以下是优化过的选择排序:
public static void chooseGood(int[] arr){
for (int x=0;x<arr.length-1 ; x++) {
int num=arr[x]; //定义变量记录数据
int index=x; //定义变量记录下标
for (int y=x+1;y<arr.length-1;y++ ) {
if (arr[y]<num) { //如果数据有更小的
num=arr[y]; //记录较小数据值
index=y; //记录较小数据下标
}
}
if (index!=x) { //判断较小值的下标与当前位置下标是否一致(也就是说当前位置是否本来就是最小值)
swap(arr,x,index); //利用较小值的数据下标和当前位置下标来交换两者的值
}
}
} 然鹅……我们折腾这么久,其实Java中有能够排序的方法 Arrays.sort(arr); 只要传数组名进去,Java就会帮你排好序,不得不说Java真是一门贴心的语言呀,但是Java有,别的语言不一定有,所以必要的算法还是要懂滴。
选择排序和冒泡会用到数据的位置交换,所以为了提高代码复用性,我们先写一段数据位置交换的代码: public static void swap (int[] arr,int a,int b){
int temp=arr[a];
arr[a]=arr[b];
arr[b]=temp;
} 以下是冒泡排序;
public static void chooseMaoPao(int [] arr){ for (int x=0;x<arr.length-1 ;x++ ) { //这里 -1 是当第二个数据确定,第一个数据也确定了,可以少比较一次 for (int y=0;y<arr.length-1-x;y++ ) { //这里 -x 是已经排过序的数据可以不再参与排序,提高效率,虽然不-x也是可以的 if (arr[y]>arr[y+1]) { //判断两个数据的大小(将较大数换到后面) swap(arr,y,y+1); //调用swap方法完成两个数据交换位置 } } } }选择排序:选择排序是从第一个小标的数据开始,以后的每一个数据都与它比较一次,将较小者放在第一个位置上,这样比到最后一个数据,第一个位置的数据就确定了;再进行第二个位置的确定,以后的每一个数据与第二个位置的数据进行比较,较小者放在第二个位置上(假定数据从小到大排序)。直到确定倒数第二个位置上的数据,那么最后一个位置的数据也就确定了,排序结束。同样,大圈套小圈思想。
以下是选择排序:
public static void choosePaiXu(int [] arr){
for (int x=0;x<arr.length-1 ;x++ ) { //这里 -1 当倒数第二个位置的数据确定,最后一个位置的数据也就确定了
for (int y=x+1; y<arr.length;y++ ) { //这里 y=x+1,0-x是排过序的位置,x+1是指从尚未排序的位置开始确定数据的值
if (arr[x]>arr[y]) { //判断两个数据的大小(将较小的数据放在要确定的位置上)
swap(arr,x,y); //调用swap方法完成两个数据交换位置
}
}
}
} 写选择排序的时候我们发现,当确定一个位置的时候,只要是发现了比这个位置上的数据更小的数据,我们就要调用swap方法进行两个数据的交换,来达到这个位置上的数据保持在最小,可是这样并不是最优的做法,因为每一次交换就要重新申请临时变量,这样代码的效率比较低。所以我们可以用两个变量来记录较小值的数据和下标,每一次比较是和这个变量比,遇到更小的值就赋值给变量,当比较完之后,这个两个变量记录的就是最小值的数据和下标。此时只需要将最小值的数据与要排位置的数据交换即可。
以下是优化过的选择排序:
public static void chooseGood(int[] arr){
for (int x=0;x<arr.length-1 ; x++) {
int num=arr[x]; //定义变量记录数据
int index=x; //定义变量记录下标
for (int y=x+1;y<arr.length-1;y++ ) {
if (arr[y]<num) { //如果数据有更小的
num=arr[y]; //记录较小数据值
index=y; //记录较小数据下标
}
}
if (index!=x) { //判断较小值的下标与当前位置下标是否一致(也就是说当前位置是否本来就是最小值)
swap(arr,x,index); //利用较小值的数据下标和当前位置下标来交换两者的值
}
}
} 然鹅……我们折腾这么久,其实Java中有能够排序的方法 Arrays.sort(arr); 只要传数组名进去,Java就会帮你排好序,不得不说Java真是一门贴心的语言呀,但是Java有,别的语言不一定有,所以必要的算法还是要懂滴。
相关文章推荐
- 选择排序和冒泡排序区别以及冒泡排序优化
- java版排序算法简介及冒泡排序以及优化,选择排序,直接插入排序,希尔排序,堆排序,快速排序及其优化前言 2 分类 2 稳定性 3 时间复杂度 4 Java实现版本 5 1、冒泡排序 6 2、选择排序
- 【数据结构与算法】内部排序之二:冒泡排序和选择排序(改进优化,附完整源码)
- 排序算法一:冒泡排序,插入排序以及选择排序原理与MATLAB实现
- 冒泡排序、选择排序、插入排序,效率以及应用场景
- 选择排序以及冒泡排序
- 第十七篇:内部排序之二:冒泡排序和选择排序(改进优化,附完整源码)
- 选择排序和冒泡排序以及求最大数和求最小数
- 数据结构-选择排序以及对它的优化
- 冒泡排序和选择排序以及两个变量交换
- 排序----冒泡排序的优化_选择排序_插入排序
- c语言的简单排序:选择排序和冒泡排序及他们的优化
- 内部排序之二:冒泡排序和选择排序(改进优化,附完整源码)
- OutMan——C语言中的冒泡排序、选择排序、折半查找以及指针的介绍
- 使用shell排序,插入排序,选择排序,冒泡排序,以及java的Arrays中自带的排序进行对比
- 冒泡排序和选择排序以及封装
- 【数据结构与算法】内部排序之二:冒泡排序和选择排序(改进优化,附完整源码)
- 冒泡排序,选择排序,插入排序,快速排序的比较及优化
- 冒泡排序、选择排序、插入排序以及二分法查找算法
- 利用随机类生成数组,并用冒泡排序以及选择排序对不同数组的元素进行从小到大的排序