本来一开始是学习那个排序的后来发现了个不用设置中间变量就能将两个数换位置的算法 发出来给大家分享一下代码纯自己打的 可能变量名字 有点丑 将就看把……
// 先定义两个变量
int a=5;
int b=3;
//开始换位置了
a=a+b;
//此时b就等于a的值 a还是两个数的和
b=a-b;
//此时a-b就等于b的值 成功换位置
a=a-b;
学习了这个算法以后我就兴冲冲的去把我之前写的选择排序的代码中间变量交换的地方全都改成这个了
悲剧发生了 我发现我排出来的数据 有很多都是0 但是本身数组里面没有0
我就纳闷了 半天也没弄明白到底为什么 后来我就一步一步的调试代码 终于发现问题了
int min=0;
int minIndex=0;
int temp=0;
public void xuanze(int[]arr)
{
for(int i=0;i<arr.length;i++)
{
min=arr[i];
minIndex=i;
for(int j=i+1;j<arr.length;j++)
{
if(min>arr[j])
{
minIndex=j;
min=arr[j];
}
}
arr[i]=arr[i]+arr[minIndex];
arr[minIndex]=arr[i]-arr[minIndex];
arr[i]=arr[i]-arr[minIndex];
}
}
这个一段选择排序的算法 明白上面换位算法的朋友 可能说没问题
但是 有一种可能就是 排序第一趟后的比较 若第一个数就是最小值
此时i=minIndex 当这种情况发生的时候就造成了arr[minIndex]和arr[i]的值一样
当这段代码完了 arr[minIndex]和arr[i]将都被清空 排序会出问题
所以改进代码为
if(i!=minIndex)
{
//假如i=minIndex这种交换会将两个数据都清空
arr[i]=arr[i]+arr[minIndex];
arr[minIndex]=arr[i]-arr[minIndex];
arr[i]=arr[i]-arr[minIndex];
}
只要换位时候比较一下是不是索引相同就行了
完结 撒花!
可能我这个表达能力不强 说的不好懂 大概就是这个意思啦
也许大家早就知道了 可是我这个是调试半天才发现的 也给大家分享一下吧
|
|