黑马程序员技术交流社区
标题:
选择排序与冒泡排序,为什么冒泡排序会存在下标越界问题
[打印本页]
作者:
Seejun
时间:
2014-12-13 15:00
标题:
选择排序与冒泡排序,为什么冒泡排序会存在下标越界问题
选择排序为:
/*
需求:使用选择排序法遍历一维数组
思路:1、定义并遍历数组
2、定义临时变量temp存放最值
3、用第一个数与其后的数逐个比较,获取最值
4、用第二个数与其后的数逐个比较,获取第二最值
5、以此类推,比较arry.length-1次,获得新数组,并遍历数组
*/
class ArryChange1
{
public static void main(String[] args)
{
int[]arry={12,8,21,9,14,5};
System.out.print("原数组为:");
for (int x:arry)
{
System.out.print(x+" ");
}
for (int a=0;a<arry.length ;a++ )
{
for (int b=a+1;b<arry.length ;b++ )
{
if (arry[a]<arry[b])
{
int temp=arry[a];
arry[a]=arry[b];
arry[b]=temp;
}
}
}
System.out.println(); //换行
System.out.print("选择排序后的数组为:");
for (int x:arry)
{
System.out.print(x+" ");
}
}
}
复制代码
-------------------------------------------------------------------------------------
冒泡排序为:
/*
需求:使用冒泡排序法遍历一维数组
思路:1、定义并遍历数组
2、定义临时变量temp存放最值
3、从第一个数起,与其后相邻的数进行比较,最值互换,可想象为最值向右移(冒泡)
4、进行arry-1次比较后得到新数组,遍历数组*/
class ArryChange2
{
public static void main(String[] args)
{
int[] arry={5,11,9,12,7,14};
System.out.print("原数组顺序为:");
for (int a=0;a<arry.length ;a++ )
{
System.out.print(arry[a]+" ");
}
for (int a=0;a<arry.length ;a++ ) //for (int a=0;a<arry.length-1 ;a++ )
{
for (int b=0;b<arry.length-a ;b++ ) //for (int b=0;b<arry.length-a-1 ;b++ )
{
if (arry[b]<arry[b+1])
{
int temp=arry[b];
arry[b]=arry[b+1];
arry[b+1]=temp;
}
}
}
System.out.println(); //换行
System.out.print("冒泡排序后数组顺序为:");
for (int a=0;a<arry.length ;a++ )
{
System.out.print(arry[a]+" ");
}
}
}
复制代码
--------------------------------------------------------------------------------------
冒泡排序为什么要-1才不会报错呢?
QQ图片20141213145919.jpg
(77.78 KB, 下载次数: 20)
下载附件
2014-12-13 14:59 上传
作者:
史云龙
时间:
2014-12-13 15:06
a从1开始取就好了。或者b的最大值小于array.length-a-1。
/**
* @author 史云龙
* 完成数组的快速排序
* 数组【100,40,60,87,34,11,56,0】
*冒泡排序:
*从小到大排列
*/
public class BubbleSort {
/**
* @param args
* 主函数
*/
public static void main(String[] args) {
int[] array = {100,40,60,87,34,11,56,0};
sop("未进行快速排序的数组:");
print(array);
sop("已经进行快速排序的数组:");
sort(array);
print(array);
}
/**
* @param array
* 冒泡排序[从小到大排序]
* 算法说明:
* 1、比较相邻的元素。
* 第1次比较第一个和第二个元素。
* 第2次比较第二个和第三个元素。
* 依次比较,如果前一个比后一个大则交换位置。
* 第一轮比较后,将最大的元素移到最后一个位置。
* 2、因为还有进行后续轮数比较故用两个循环
* 外层循环表示,轮数。
* i表示轮数
* 内层循环表示,当前轮数,数组内元素比较。
* j表示元素内数组的位置。
* 3、每一轮比较取出一个最大的数,故需要比较array.length-1次。
* 比较array.length-1次后剩余一个元素,不需要比较。
* 每一次比较后,最大的数在最后故在元素内比较时,
* 最后i个位置不要比较,同时在比较倒数最后两个位置时,
* 需要考虑数组越界问题即j需要小于array.length-i
* 即最大值为array.length-i-1。
*/
public static void sort(int[] array){
for(int i=1;i<array.length;i++){
for(int j=0;j<array.length-i;j++){
if(array[j]>array[j+1]){
swap(array,j,j+1);
}
}
}
/*
for(int i=0;i<array.length-1;i++){
for(int j=0;j<array.length-i-1;j++){
if(array[j]>array[j+1]){
swap(array,j,j+1);
}
}
}
*/
}
/**
* @param b【传入数组并进行打印】
*/
public static void print(int[] b){
for (int i=0;i<b.length;i++){
sop(b[i]);
if(i==b.length-1){
sop("\n");
}else{
sop(" , ");
}
}
}
/**
* @param array
* @param i
* @param j
* 将符合条件的数组数据交换位置
*/
public static void swap(int[] array,int i,int j){
int temp = array[i];
array[i]=array[j];
array[j]=temp;
}
/**
* @param obj[将obj输出]
*/
public static void sop(Object obj){
System.out.print(obj);
}
复制代码
作者:
李天富
时间:
2014-12-13 15:18
因为第一次内循环时,a=0,b最大值为arry.length-1,此时b+1就越界了。
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2