相邻元素两两比较,大的往后放,第一次完毕,最大值出现在了最大索引处
分析:
第一次比较排序的结果:会把其中最大的数据排到最大的索引处
第二次比较排序后的结果:因为第一次已经把最大的一个数据放到了最大的索引的地方,
所以这次要进行比较的数据比数组里面的元素的数据个数-1个,而第二大的数据也会排到第二大的索引处
第三次比较排序的结果:跟第二次差不多,只是这次要进行比较的数据比数组里面的元素的数据个数还少了2个,
第四次:少3个..
综上所述,要使数组里面的数据按照从小到大排序,总的比较的次数会比数组的长度-1次,
而随着比较的次数的增加,每次要进行比较的数据依次减少,也就是
for(int x =0; x < arr.length - 1 ;x++){这个是总的比较的次数
for(int y =0; y < arr.length - 1 - x; y++){ 这个就是随着次数的增加,每次要进行比较的数据的个数
}
}
实例
int int x,y,t;
for(int x =0; x < arr.length - 1 ;x++){
for(int y =0; y < arr.length - 1 - x; y++){
if(arr[y]>arr[y+1]){
t=arr[y];
arr[y]=arr[y+1];
arr[y+1]=t;
}
}
}
冒泡排序基本概念是:依次比较相邻的两个数,将小数放在前面,大数放在后面。即在第一趟:首先比较第1个和第2个数,将小数放前,大数放后。然后比较第2个数和第3个数,将小数数放后,如此继续,直至比较最后两个数,将小数放前,大数放后。至此第一趟结束,将最大的数放到了最后。在第二趟:仍从第一对数开始比较(因为可能由于第2个数和第3个数的交换,使得第1个数不再小于第2个数),将小数放前,大数放后,一直比较到倒数第二个数(倒数第一的位置上已经是最大的),第二趟结束,在倒数第二的位置上得到一个新的最大数(其实在整个数列中是第二大的数)。如此下去,重复以上过程,直至最终完成排序。
数组排序之选择排序:
从0索引开始,依次和后面元素比较,小的往前放,第一次完毕,最小值出现在了最小索引处
分析:
1:首先是0索引上的数据依次跟后面各个索引上的数据进行比较,
直到遇到一个比它小的数据,这时候,这个小的数据就替换掉0索引上原来的数据,
接着这个替换掉的数据继续跟它原来的索引位置的后面的索引上的数据进行比较
例如:{22,11,13,10} 22跟11比后,变成{11,22,13,10},接着11继续跟13、10比较,遇到10后,变成{10,22,13,11}
也就是说,进行完A后,0索引上的数据肯定是这个数组上最小的数据
2:接着就是1索引上的数据来跟后面的数据进行比较,这个时候参与比较的数据比原来少了一个
3:跟2一样,就这样进行下去,知道全部都比较完毕。
4:总结上面,得出总共需要进行几次A步骤的次数:
如果是5个数据的数组的话,就一共需要比较arr.length(4)次,若从0开始计数,则是 4-1 = 3次
而每次比较时,所参与的索引的数据是不一样的:
第一次时,是0和1以及后面的数据比较;
第二次时,是1和2以及后面的数据比较
...
5:从4得出
for(int x = 0; x< arr.length - 1; x++){
for(int y = x+1; y < arr.length ;y++){
}
}
int i,j,t;j为数组下标t为定义的要插入的数
for(i=1;i<len;i++)len为数组的长度
{
j=i-1;
tmp=arr[i];arr为要排序的数组
while(j>=0&&arr[j]>t)
{
arr[j+1]=arr[j];
j--;
}
arr[j+1]=t;
}
选择排序它的基本思想是:第一次从R[0]~R[n-1]中选取最小值,与R[0]交换,第二次从R{1}~R[n-1]中选取最小值,与R[1]交换,...., 第i次从R[i-1]~R[n-1]中选取最小值,与R[i-1]交换,.....,第n-1次从R[n-2]~R[n-1]中选取最小值,与R[n-2]交换,总共通过n-1次,得到一个按排序码从小到大排列的有序序列.