两种排序方式
现在介绍两种著名的排序方式:
1, 冒泡排序:相邻元素进行比较,较大的往右边移动:结果就是每一次排序,最大的都会移动到右边。最后结果就是升序的序列。
如:3,4,2,6,7
第一轮:1,3<4 不变 3,4,2,6,7
2,4>2 交换位置 3,2,4,6,7
3,4<6 不变 3,2,4,6,7
4,6<7 不变 3,2,4,6,7
第二轮:1,3>2 交换位置 2,3,4,6,7
2,3<4 不变
3. 4<6 不变
.。。。
转换成一般性规律,每一轮比较最大值就会移动到最右边来,一共会比较个数-1次。
用代码实现的话:
for(int i=0;i<a.length-1;i++){
for(int j=0;j<a.length-1-i;j++){
if(a[j]>a[j+1]){
int temp;
temp =a[j];
a[j]=a[j+1];
a[j+1]=temp;}}}
外层的i循环表示的循环次数,内循环表示每一轮循环的状况,变化在于j<a.length-1-i,因为每一轮循环后,都会排出一个最大值,那个不用再进行比较,所以减去循环的次数。
2,选择排序:有一个数组a[i]的话,选择排序就是a[0]和后面的元素依次比较,接着a[1]和后面的元素一次比较
例:a[]={7,3,2,8,6,4}
第一轮:1,7>3,交换,3,7,2,8,6,4
2, 3>2,交换,2,7,3,8,6,4
3,3<8,3<6,3<4后面三步都是小于,所以不变。
第一轮结果:2,7,3,8,6,4
第二轮:1,7>3,交换,2,3,7,8,6,4
2,3<7,3<8,3<6,3<4.后面四部都是小于,所以不变
第二轮结果:2,3,7,8,6,4
第三轮:1,7<8 不变
2,7>6,交换,2,3,6,8,7,4
3,6>4,交换,2,3,4,8,7,6
第四轮1,8>7,交换,2,3,4,7,8,6
2,7>6,交换,2,3,4,6,8,7
第五轮1,8>7,交换,2,3,4,6,7,8
上述过程,说明选择排序,每一轮都是把最小值选出放在左边,经过元素个数-1论比较。
源码:
for(int i=0;i<a.length-1;i++){
for(int j=i+1;j<a.length;j++){
if(a[i]>a[j]){
int temp;
temp =a[i];
a[i]=a[j];
a[j]=temp;}}}
外层循环i,是表示循环的次数,内存是比较的逻辑,需要注意的是:初始值j=i+1,是因为,在一轮比较中a[i]是固定不变的,只需要下标i比较后面的值,而限定条件j<a.length的原因,每一回都取到的最右边的值,也就是a[a.length-1]。