1.冒泡排序
- 冒第一个泡,写一个循环,让数组中的最大值出现在数组的最后一个位置
冒第二个泡,写一个循环,让数组中的第二大值出现在数组的最倒数第二个位置
...
两两对比,大值放在后面!5个数数据,冒最大的泡,需要对比多少次?4次,所以循环4次就可以出结果了
public class demo1 {
public static void main(String[] args) {
int[] arr = {99,8,3,87,12};
// 外层循环用来控制需要循环多少次
//最后一个不用动,所以只需要循环数组长度减1次 就可以完成
//内层循环用来操作一个一个的交换位置(俗称冒泡)
for(int i = 0;i<arr.length-1;i++){
// 99先和3对比,99大,所以代替3的位置,继续和8对比,他只需要对比arr.length-1次
//(写0是为了看出规律)
// 用循环的话就是
// for(int j=0;j<arr.length-1-0;j++){
// if(arr[j]>arr[j+1]){
// int temp = arr[j] 用临时变量,交换他俩位置
// arr[j] = arr[j+1]
// arr[j+1] = temp
// }
// } 结果是 {8,3,87,12,10,56,65,99};
//再来一次 8先和3对比,8大,所以代替3的位置,继续和87对比,
//但是不需要对比最后一个,因为已经对比过了上一轮,所以就是去掉数组的最
//后一位arr.length-1-1
// 用循环的话就是
// for(int j=0;j<arr.length-1-1;j++){
// if(arr[j]>arr[j+1]){
// int temp = arr[j] 用临时变量,交换他俩位置
// arr[j] = arr[j+1]
// arr[j+1] = temp
// }
// }
// 所以 外面的循环控制需要几次,里面的进行一个一个的对比。
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;
}
}
}
/// 最后结果的打印:
for (int i= 0;i<arr.length;i++){
System.out.println(arr[i]);
}
}
}
2. 数组查找 -- 二分查找
public class erfen {
public static void main(String[] args) {
int[] arr = {1,3,5,7,8,9,10};
int num = 10;
int left = 0;
int right = arr.length-1;
int mid = (left+right)/2; //先从中间开始猜
int index = -1;
while(left<=right){ //循环多少次不知道,猜的区间一直在缩小,不能让左边比右边还大
if(num == arr[mid]){ // 如果正好,num == arr[mid] 直接结束循环;
index = mid;
break;
}
if(num>arr[mid]){
left = mid+1; //直接从中间往上猜
}
if(num<arr[mid]){
right = mid-1; // 直接从中间往下猜
}
mid = (left+right)/2; // 重新计算下,从新的区间的中间开始猜。
}
System.out.println(index);
}
}
3.简单选择排序
- 思想
- 找到数组中的最大值,放在最后一个位置
- 找到数组中第二大的值,放在倒数第二个位置
public class jdxz{
public static void main(String[] args){
int[] arr = {4,3,67,23,5,99};
// 想让这个值为数组第一项
// 第一步 :先找到最大值 int max = 67; int index = 2; 把他放到最后。
// 所以循环就可以从第一位开始对比了
// (就是max 先和index =1的对比,一直到最后,谁大,就把它赋值给max)。
// for(int i = 1;i<arr.length-1;i++){
// if(arr[i]>max){
// index = i;
// max = arr[i];
// }
// }
// 如果index 正好是最后一位,就没必要交换了
// if(index!=arr.length-1){
// int temp = arr[index];
// arr[index] = arr[arr.length-1];
// arr[arr.length-1] = temp;
// }
for (int j=0; j<arr.length-1;j++){
int max = arr[0];
int index = 0;
for(int i = 1;i<arr.length-j;i++){
if(arr[i]>max){
index = i;
max = arr[i];
}
}
// 如果index 正好是最后一位,就没必要交换了
if(index!=arr.length-1-j){
int temp = arr[index];
arr[index] = arr[arr.length-1-j];
arr[arr.length-1-j] = temp;
}
}
for (int i=0;i<arr.length;i++){
System.out.println(arr[i]);
}
}
}
4.数组里重复的有几个
public class Test1 {
public static void main(String[] args) {
//这个题目是有难度的,日测已经简单很多天了!拔高的题目
char[] arrs={'a','c','a','a','b'};
char[] arrs1=new char[arrs.length];
int[] nums=new int[arrs.length];
int count=0;//记录字符的种类数据
for(int i=0;i<arrs.length;i++){
//1. 取到arrs中的一个字符(从数组中取出来的一个字符)
char c=arrs[i];
//2. 去arrs1中进行判断,是否存在的判断
int index=-1;
for(int j=0;j<count;j++){
if(c==arrs1[j]){
//如果进入到if说明找到相同的了,说明之前添加过该字符
index=j;
}
}
//3. 根据index的值判断之前是否出现过该字符(c)
if(index==-1){
//说明该字符就是第一次出现
arrs1[count]=c;
nums[count]=1;
count++;
}else{
//说明该字符不是第一次出现
nums[index]=nums[index]+1;
}
}
//查看结果
for (int i = 0; i < count; i++) {
System.out.println(arrs1[i]+"-----"+nums[i]);