---------------------- <a href="http://edu.csdn.net"target="blank">ASP.Net+Android+IOS开发</a>、<a href="http://edu.csdn.net"target="blank">.Net培训</a>、期待与您交流! ----------------------
排序
原理
1.排序,排序有很多中,在代码应用最多的排序,一般的是,选择排序,冒泡排序,插入排序,虽然一些排序效率很高,(例如:希尔排序)但一般应用较少而且难以理解
(1)选择排序
它的原理是数组中的一个元素跟其他元素依次进行比较,来确定自己的位置。
(2)冒泡排序
它的原理是数组中的相邻的两个元素进行比较,比较出现大小,根据是升序还是降序交换位置,
比较完一次就可以把数组的最后一位就确定(最大值或最小值)这样最后一位就不用参与比较,
这样依次就可以排出数组顺序,相较于选择排序,冒泡较为提高效率
(3)插入排序
插入排序它的实现原理 通俗讲就是把数组元素看做一个有序表和一个无序表,
开始有序表只包含一个元素,无序表中包含n-1个元素,排序过程中每次从无序表中取出第一个元素,
把它的排序码依次与有序表元素的排序码进行比较,将它插入到有序表中的适当位置,使之成为新的有序表。
也就是说
(为了方便理解我就想是建立一个临时容器进行存储,但是数组类型,数组是一个不变长度的类型,这是不成立只是为了理解)
在实际开发中其实不这样用,用Arrays类排序,方便
代码体现
class Test1
{
public static void main(String[] args)
{
//创建一个数组
int[] arr= {3,1,4,2,7,5};
//调用排序方法
arr=insert(arr);
//对排序后的数组进行打印
System.out.print("int[] arr={");
for (int i=0;i<arr.length;i++ )
{
//对数组角标位进行判断
if(i!=arr.length-1)
System.out.print(arr[i]+",");
else
System.out.println(arr[i]+"}");
}
}
//插入排序
public static int[] insert(int[] arr)//封装成一个方法以便函数调用,
{
//遍历原数组,从角标1开始,因为当进行比较时,必须是两个元素比较大小的
//0角标位上元素和1角标位上的元素。
for (int x=1;x<arr.length ;x++ )
{
//这里这么定义只是为了好理解
int value = arr[x];// 待插入的值
int index = x;// 待插入的位置
//循环判断条件比较大小,当index>0时,比较条件满足直接交换值,插入了值与此同时待插入的角标位重新赋值,角标位向前移动。
while (index>0 && value<arr[index-1])
{
//定义第三方变量,插入值
int temp=arr[index];
arr[index]=arr[index-1]; //待插入的位置重新赋更大的值
arr[index-1]=temp;
index--; //位置向前移动。
}
}
return arr; //返回一个数组以便对象调用。
}
//冒泡排序!
public static void maoPao(int[] arr)
{
//外循环x控制的是比较的范围。角标不能自己跟自己比,所以想x<arr.length-1
for (int x= 0;x<arr.length-1 ;x++ )
{
//内循环时,相邻的角标比,比出大小,交换位置,比完一次后,最值就出现在了最后一个角标上,
//当第二次比较时y的范围就要缩小x,所以y<arr.length-x-1,每次的最值都会出现在被比较的最后一个角标上了
//以此类推,一个有序的数组就出来了,
for (int y=0;y<arr.length-x-1 ;y++ )
{
//比较相邻角标位上的值。
if (arr[y]>arr[y+1])
{
//定义第三方变量,交换值。
int temp = arr[y];
arr[y]= arr[y+1];
arr[y+1]=temp;
}
}
}
}
//选择排序
public static void select(int[] arr)
{
//0角标上的元素依次与1角标、2角标...arr.length-1角标比较。
//外循环控制的是 比较角标,内循环控制的是被比较角标。
//外形循环直取到arr.leng-2角标,就不取了,因为arr.length-1角标不会自己跟自己比。
//内循环,是被比较的角标,他首先是比外循环的角标要大1,这样被比较的角标和比较角标不会相同,而是相邻。
//而且内循环被比较的角标是可以取到arr.length-1角标的
for (int x= 0;x<arr.length-1 ; x++)
{
for (int y=x+1;y<arr.length ;y++ )
{
//判断大小,
if (arr[x]>arr[y])
{
//定义第三方变量,交换值。
int temp = arr[x];
arr[x]= arr[y];
arr[y]=temp;
}
}
}
}
}
画图体现
1.选择排序
数组中的一个元素跟其他元素依次进行比较,来确定自己的位置
插入