排序算法
选择排序
例:数组排列。
假设有如下数组:
int[] arr={1000,5,564,8,54546,321,56,6356,23,15345,4313156};
分析:先假设最小值在0这个位置,定义一个最小值minPos=0,然后将1000与后面的数相比较,发现5<1000,所以minPos更新为1.再将5与后面进行对比,发现5就是最小值。然后通过代码实现,得到有如下代码:
int minPos=0;//找出一个最小的目标值
for (int j = 1; j < arr.length; j++)
{
if (arr[j]<arr[minPos])//实现位置更新当minPos的位置值大于j位置时交换下标位置
{
minPos=j;
}
}
System.out.println("最小值"+minPos);//打印观察对不对
经过如上操作之后,我们应该将对应的值进行交换。所以应该定义temp这个临时变量,去交换值。
int temp=arr[0];
arr[0]=arr[minPos];
arr[minPos]=temp;
经过有如上操作,我们找出第一个数,并将其位置排序到第一个。
然后我们分析后面的数组。发现步骤与上述步骤相同,所以定义一个循环去重复之前的算法。minPos应该与i的变换相同,重整代码逻辑,得到有如下代码:
for (int i = 0; i <arr.length ; i++)
{
int minPos=i;//找出一个最小的目标值
for (int j = i+1; j < arr.length; j++)
{
if (arr[j]<arr[minPos])//实现位置更新
{
minPos=j;
}
}
System.out.println("最小值"+minPos);//打印观察对不对,会每次打印排序
int temp=arr[i];
arr[i]=arr[minPos];
arr[minPos]=temp;
}
加上输出语句,便实现了排序。
//打印排序后的数组
for (int i = 0; i < arr.length; i++)
{
System.out.println(arr[i]);
}
}
接下来我们需要对算法进行精细化,去处理边界值,以及对方法们,可以进行封装。最终可以得到如下代码:
public static void main(String[] args)
{
int[] arr = {1000, 5, 564, 8, 54546, 321, 56, 6356, 23, 15345, 4313156};
for (int i = 0; i < arr.length - 1; i++)//实际上外层循环可以少一次
{
int minPos = i;//找出一个最小的目标值
for (int j = i + 1; j < arr.length; j++)
{
// if (arr[j]<arr[minPos])//实现位置更新
// {
// minPos=j;
// }
minPos = arr[j] < arr[minPos] ? j : minPos;//三目运算符代替if循环
}
System.out.println("最小值" + minPos);//打印观察对不对
change(arr,i,minPos);
//观察每一步的变化
System.out.println("这是第" + i + "次的内容");
print(arr);
}
}
public static void print(int[] arr)
{
for (int i = 0; i < arr.length; i++)
{
System.out.print(arr[i] + " ");
}
}
public static void change(int[] arr,int i,int j)
{
int temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
还可以通过同时找到最大值最小值减少一半的遍历,或者同时三个数相比较,也也可以实现循环量的减少。