一、冒泡排序
//冒泡排序
public class BubbleSort {
public static void main(String[] args) {
// 声明数组
int arr[] = new int[20];
// 随机产生20个数字
for (int i = 0; i < arr.length; i++) {
// 产生1~100之间的数字
arr[i] = (int) (Math.random() * 100 + 1);
}
System.out.println("原数组是:");
for (int i = 0; i < arr.length; i++) {
System.out.print(arr[i] + "\t");
// 判断,每5个换行
if ((i + 1) % 5 == 0) {
System.out.println();
}
}
// 外层循环控制提交的轮数
for (int i = 0; i < arr.length - 1; i++) {
// 内层控制比较的次数
for (int j = 0; j < arr.length - 1 - i; j++) {
// 比较,交换元素
if (arr[j] > arr[j + 1]) {
int temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
}
}
}
System.out.println("----------------------------------------");
System.out.println("排序后的数组:");
for (int i = 0; i < arr.length; i++) {
System.out.print(arr[i] + "\t");
// 判断,每5个换行
if ((i + 1) % 5 == 0) {
System.out.println();
}
}
}
}
二、比较排序
/**
* 比较排序
*
*
*/
public class Test2{
public static void main(String[] args) {
//声明数组中
int[] arr = new int[20];
//遍历数组, 随机生成元素内容
for (int i = 0; i < arr.length; i++) {
//生成1~100的随机数
arr[i] = (int) (Math.random()*100 + 1);
}
//输出初始内容
System.out.println("原数组内容如下:");
for (int i = 0; i < arr.length; i++) {
//输出元素内容
System.out.print(arr[i] + "\t");
//判断是否换行
if(i%5 == 4) { //(i+1)%5==0
System.out.println();
}
}
System.out.println("===========================================");
/* 升序排列 */
//外层循环, 决定比较的轮次, 决定每轮需要确定的元素的下标
for (int i = 0; i < arr.length-1; i++) {
//内层循环, 决定每轮比较时, 用于和i进行比较的下标的起止
for (int j = i+1; j < arr.length; j++) {
//比较, 将较小的元素交换到下标i中
if(arr[i] > arr[j]) {
int temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
}
}
//输出结果
System.out.println("排序后的数组内容如下:");
for (int i = 0; i < arr.length; i++) {
//输出元素内容
System.out.print(arr[i] + "\t");
//判断是否换行
if(i%5 == 4) { //(i+1)%5==0
System.out.println();
}
}
System.out.println("===========================================");
}
}
三、插入排序
/**
* 插入排序
* 基于插入算法的排序
*
*
*/
public class Test3{
public static void main(String[] args) {
//声明数组中
int[] arr = new int[20];
//遍历数组, 随机生成元素内容
for (int i = 0; i < arr.length; i++) {
//生成1~100的随机数
arr[i] = (int) (Math.random()*100 + 1);
}
//输出初始内容
System.out.println("原数组内容如下:");
for (int i = 0; i < arr.length; i++) {
//输出元素内容
System.out.print(arr[i] + "\t");
//判断是否换行
if(i%5 == 4) { //(i+1)%5==0
System.out.println();
}
}
System.out.println("===========================================");
/* 插入排序, 升序 */
/*
* 将数组划分成两个部分, 已经排序的部分, 和没有排序的部分
* 依次从未排序的数组中取出元素, 按照插入算法, 插入已经排序的数组部分
*/
//外层循环, 确定每次需要插入的元素的下标
for (int i = 1; i < arr.length; i++) {
//内存循环, 遍历已经排序的数组的所有元素, 与需要插入的元素比较, 确定插入的具体效果
for (int j = 0; j < i; j++) {
//判断, i下标的元素比j下标的元素小时, 交换
if(arr[i] < arr[j]) {
int temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
}
}
//输出结果
System.out.println("排序后的数组内容如下:");
for (int i = 0; i < arr.length; i++) {
//输出元素内容
System.out.print(arr[i] + "\t");
//判断是否换行
if(i%5 == 4) { //(i+1)%5==0
System.out.println();
}
}
System.out.println("===========================================");
}
}
四、算法题
要求:n个人排成一圈进行报数,报的次数为m,报到编号m时,m出列,剩下的人继续报数,求最后剩下的报数人的编号?
如:n:1、2、3、4、5(人)
m:4(次)
第一次出列:4
第二次出列:3
第三次出列:5
第四次出列:2
最后剩下人编号:1
代码如下:
//报数
public class Test4 {
public static void main(String[] args) {
Scanner input=new Scanner(System.in);
List<Integer> list=new ArrayList<Integer>();
System.out.println("请输入报数的人数:");
int n=input.nextInt();
System.out.println("请输入报数的次数:");
int m=input.nextInt();
//拿到人数的编号
for (int i = 1; i <=n; i++) {
list.add(i);
}
//计数器
int count=0;
//报数,直到剩下一人为止
while(list.size()>1) {
//
for (int i = 0; i <list.size(); i++) {
//计数开始
count++;
//判断,当计数器等于报的次数时
if(count==m) {
//出列的数:移除出来
System.out.println("出列的数:"+list.remove(i));
//计数器归0
count=0;
//下标还原
i--;
}
}
}
System.out.println("剩下人的编号:"+list.get(0));
}
}