冒泡排序(从小到大)
比较相邻的元素。如果第一个比第二个大,就交换他们两个。
对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。在这一点,最后的元素应该会是最大的数。
参考上图,最上面的就是数组里面的数字,是乱序的,长度为4;
第一轮就用15和后面的数字相比,15在数组的下标是0,就和6比(下标1),如果15比6大,那么他们两个就交换位置,然后15现在的下标就是1,然后再和4比(下标2),如果15比4大,他们就交换位置,现在15的下标就是2,再和8比(下标3),如果15比8大,那么他们就交换位置,然后现在15的下标就是3,然后第一轮比完,15就到最右边去了,15就不用比了,因为15已经是最大了。于是第一轮就只比了3次。
第二轮就用第一轮的结果,用6和4比,如果6比4大,那么就交换位置,然后6现在的下标是1,再和8比,如果6比8大就交换位置,现在显然不是,就不用交换位置,因为15已经是最大了就不用再比了,现在数字8也比出来了,是比15小的数字。于是第二轮就比了2次。
第三轮就是用第二伦的结果,用4和6比,如果大的话就交换位置,现在显然4并不比6大,就不用交换位置,于是6就是比8小的数字,4就是最小的数字。不知不觉就把这4个数的顺序由小到大排列出来了。
于是我们得到了3个结论:
1.循环的轮数:长度-1
2.每一轮比较的次数递减
3.首轮的次数为:长度-1
好了,接下来我们就直接上代码
int[] arr={54,34,48,17}; //定义数组
for(int i=0;i<arr.length-1;i++){ //定义有几轮
for(int j=0;j<arr.length-1-i;j++){ //定义每轮比较几次
if(arr[j]>arr[j+1]){ //判断下标n是不是比n+1大
arr[j]=arr[j]^arr[j+1]; //这里三行就是让n和n+1换位的
arr[j+1]=arr[j]^arr[j+1];
arr[j]=arr[j]^arr[j+1];
}
}
}
System.out.println(Arrays.toString(arr)); //排序完成,打印输出
选择排序
我这个版本的选择排序是把数组的第一个元素下标设一个变量,是用来存放最小的数字下标的,用这个数字和下一个数字进行比较,如果这个数字大于他后面的那个数字,那么就说明后面的数字比他小,就把这个比他小的下标赋值给存放最小数字下标的变量里面。挨个比较就会找出最小数字的下标,然后就和第一个元素互换。
参考上图,第一轮就拿数组第一个元素3开始,用3和他后面的那个数比较,如果3大于9,那么就把9的下标赋值给变量,如果不是就不变,前3次比较发现3都是较小的哪一个,到第4次的时候3就会比1大,然后就会把1的下标赋值给变量。最后用 arr[0]=arr[index]和第一个元素调换位置就行了(这里假设index是最小的数的下标,arr[0]就是数组的第一个元素),于是现在第一个最小的数就出来了。
第二轮就拿数组第2个元素也就是arr[1]依次和后面的数进行对比,如果arr[1]>arr[2]那么就把arr2的下标赋值给变量,最后再arr[1]=arr[index] 把最小数个数组第二个元素调换位置即可。
后面也是这样,第三论拿第三个元素和后面作比较。
这里我们也可以得出结论:
1.最大轮数:长度-1
2.每轮比较次数递减
3.首轮比较次数为长度-1
4.每轮的选择数都在递增
下面我们直接上代码:
int[] arr={54,34,48,17,14};
for(int i=0;i<arr.length-1;i++){ //控制几轮
int index=i; //假设最小数字下标,随轮数变化
for(int j=i+1;j<arr.length;j++){ //设置和后面的数作比较所以y=i+1
if(arr[index]>arr[j]){ //如果下标大于后面的数,说明后面的数较小,就把
index=j; //小的数的下标赋值给index;
}
}
if(index!=i){ //这一轮比价完后我们就会得到最小的数的下标
arr[i]=arr[index]^arr[i]; //于是就和第1个元素呼唤位置。到了第二轮i就会
arr[index]=arr[index]^arr[i]; //变成2,到时候最小数就会和数组第二个元素互换
arr[i]=arr[index]^arr[i];
}
}
System.out.println(Arrays.toString(arr)); //排序完成,打印输出
好了,我的冒泡排序和选择排序就讲解完了,上面写的都仅是自己的理解,如果描述不当或用的方法不对请多多理解。谢谢观看,希望我写的能让你们回想起来一点,如果写的不好也请多多理解。