public class HelloJava {
public static void main(String[] args){
HelloJava helloJava = new HelloJava();
//helloJava.maoPao();
//helloJava.xuanZe();
//helloJava.chaRu();
//二分法必须保证数列是有序的
int[] num = {2,9,9,33,43,55,67,90};
int i = helloJava.erFen(num, 55);
System.out.print(i);
}
//冒泡排序。冒泡排序是一种稳定的排序(相同元素之间两个位置并没有改变)
public void maoPao(){
int [] num = {55,33,67,2,9,90,9,43};
for (int i=0;i<num.length;i++){
for (int j = 0;j<num.length-i-1;j++){
//从小到大排序
if(num[j]>num[j+1]){
num[j] = num[j]+num[j+1];
num[j+1] = num[j]-num[j+1];
num[j] = num[j]-num[j+1];
}
}
}
for (int n:num){
System.out.println(n);
}
}
//选择排序。选择排序是一种不稳定的排序(相同元素之间两个位置可能会改变),但是速度快。
public void xuanZe(){
int [] num = {55,33,67,2,9,90,9,43};
//用于记录每次比较后最小值的下标
int minIndex = 0;
//控制轮数
for (int i=0;i<num.length;i++){
//假设每轮最小值下标为i
minIndex = i;
for (int j=i+1;j<num.length;j++){
if (num[minIndex]>num[j]){
minIndex=j;
}
}
//判断需要交换的数下标是否为自己
if (minIndex!=i){
num[minIndex] = num[minIndex]+num[i];
num[i] = num[minIndex]-num[i];
num[minIndex] = num[minIndex]-num[i];
}
}
for (int n:num){
System.out.println(n);
}
}
//插入排序.
public void chaRu(){
int [] num = {55,33,67,2,9,90,9,43};
//控制比较的次数
for (int i = 1;i<num.length;i++){
//记录操作数
int temp = num[i];
int j=0;
//循环
for (j=i-1;j>=0;j--){
if (num[j]>temp){
num[j+1] = num[j];
}else {
break;
}
}
if (num[j+1]!=temp){
num[j+1] = temp;
}
}
for (int n :num){
System.out.println(n);
}
}
//二分查找。效率极高,常用!(但首先应该是已经排好序的)
public int erFen(int[] num,int key){
//开始下标
int start = 0;
//结束下标
int end = num.length-1;
while (start<=end){
int middle = (start+end)/2;
if (num[middle]>key){
end = middle-1;
}else if(num[middle]<key){
start = middle+1;
}else {
return middle;
}
}
return -1;
}
冒泡排序、选择排序、插入排序和二分法查找
最新推荐文章于 2022-03-22 21:49:29 发布