排序:
1.冒泡排序
当我们从小到大排序的时候,我们将相邻的两个数进行比较,如果i < i - 1,就将 i 的值与 i - 1 的值进行替换,依次类推,继续比较 i 与 i + 1,当我们比较到最后面的时候,必定是最大值
public static void sort(int[] arr) {
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;
}
}
}
}
内层比较j和j+1,外层属于规定比较次数
2.选择排序
选择排序必须有一个作为排序比较的值,可以随意选择,然后从头到尾依次比较,遇到比你选择的数值大的,就直接替换掉,然后继续往下比较,最后也是最大的会排到最后面
public static void sort(int[] arr){
int temp;
for(int i=0;i<arr.length-1;i++){
temp=arr[0];
for(int j=i+1;j<arr.length;j++){
if(temp>arr[j]){
arr[i]=arr[j];
arr[j]=temp;
temp=arr[i];
}
}
}
}
3.快速排序
比较方式是从中间开始,向两边排序,就跟二分法查找有点相似,将数组多次分为两段,每次都在各自的区域中排序
public static void sort(int[] arr,int l,int r){
int i,j,temp;
i=l;
j=r;
if(i>=j){//最小值大于最大值退出
return;
}
while(i!=j){
while(i<j && arr[j]>=temp){//先比较右边,若比取得值大继续比较,直到比该值小的数
j--;
}
while(i<j && arr[i]<temp){//比较左边,与上同
i++;
}
if(i<j){//到此两值比较完,将两边的值替换掉
int k=arr[i];
arr[i]=arr[j];
arr[j]=k;
}
}
arr[l]=ar[i];//将第一遍比较完成的中间值与l替换,并将temp归位
arr[i]=temp;
sort(arr,l,i-1);//然后比较从0到n-1的区间
sort(arr,i+1,r);//其次比较n+1到length
}
查找:
1.二分查找
通过从中间开始向两边查找的方式进行查询的
public static int select(int[] arr,int s,int e,int t){
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;
}
}
}
int i=(s+e)/2;
if(t>arr[i]){
num++;
return select(arr,i+1,e,t);
}
if(t<arr[i]){
num++;
return select(arr,s,i-1,t);
}
return i;
}