//郑州轻工业大学
//题号:实验二 第一题
//题目:请写出一个二分排序,要求输入10个整数,输出排序结果。二分排序的工作原理是不断的依次将元素插入前面已排好序的序列中。在插入第i个元素时,对前面的0~i-1元素进行折半,先跟他们中间的那个元素比,如果小,则对前半再进行折半,否则对后半进行折半,直到left>right,然后再把第i个元素前1位与目标位置之间的所有元素后移,再把第i个元素放在目标位置上。
————————————————
这题比较难,关键在于二分排序,不太好理解
建议百度查一下资料
后面有完整代码连接:
适合新人学习或交作业
首先建立输入并储存数据
int[] a = new int[10]; // 用于储存输入的数 10个
Scanner sc=new Scanner(System.in);
for (int i=0;i<10;i++)
{
System.out.println("请输入第:"+(i+1)+"个数");
a[i]=sc.nextInt();
}
然后准备一堆数用来储存数据与比较
int i, j;
int left, right, mid;
int temp; //用于记录中间无序值
然后是重点开始了‘
首先找到数组中第一个无序的数,保存为temp
/* 找到数组中第一个无序的数,保存为temp */
if (a[i] < a[i - 1]) {
temp = a[i];
} else {
continue;
}
/* 找到数组中第一个无序的数,保存为temp */
然后用二分排序对无序数进行排序
/* 二分查询开始 */
left = 0;
right = i - 1;
while (left <= right) {
mid = (left + right) / 2; //这里注意如果是奇数 3/2=1
if (a[mid] > temp) {
right = mid - 1;
} else {
left = mid + 1;
}
}
/* 二分查询结束,此时a[left]>=a[i],记录下left的值 */
/* 将有序数组中比要插入的数大的数右移 */
for (j = i; j > left; j--) {
a[j] = a[j - 1];
}
/* 将有序数组中比要插入的数大的数右移 */
// 将left位置赋值为要插入的数
a[left] = temp;
然后就完成了一次排序,既把一个数通过二分法排成了有序
然后把上面的方法放进一个循环中重复几次就可以了
——
如果你上了百度,代码也看了,还是不理解的话,教你一个方法
把整个代码,全部都打上暂停,一步一步调试,走一遍流程,能很好的帮助你理解,
像这样
完整代码:https://download.csdn.net/download/muMason/54822191
超链接:完整代码
新人制作不易,真的是一个bug改一天!