0. 一些简单的解释
选择排序
- 选择[1:-1]数组中的最小值,与索引0交换数值
- 选择余下[2:-1]数组中的最小值,与索引1交换数值
- 依次遍历余下部分的数组,直到交换所有数值
冒泡排序
- 只检查相邻两个元素的大小,按升序交换位置
- 为避免最后阶段的无效比较,加入布尔值判断是否有数据进行了交换,无交换直接跳出循环结束排序
- 为避免每次比较都要遍历全部数组,加入索引规定每次遍历的索引长度,索引之后的元素再之前的排序阶段已经完成有序,无需再次遍历
快速排序
- 跳跃式的数据交换是快排比冒泡快的一个原因
- 以索引0的数值做基准对数组进行二分,从右向左找到比基准小的数,从左向右找到比基准大的数,交换
- 最终左右指针在中间相遇,此时指针左边都比基准小,右边都比基准大,交换指针与基准的数值
- 递归二分,将基准左侧和右侧分别看作新的数组重新选定基准,再次交换
- 基准的选择不唯一,通常选择索引0
归并排序
- 如果是两个长度相同或相差1的有序数组,只要依次比较同索引的数值,按照小的先放的顺序放入新数组,即可完成归并
- 归并排序就是将一个数组从中间二分,形成A,B两个子数组
- 分别对A和B进行递归二分直到分成有序或唯一元素的子数组,进行归并
- 依次对子数组进行归并操作,最终返回长度与原数组相同的有序数组
二分查找
- 每次查找都从有序数组的中间位置开始
- 升序时,若中间位置的数值比要找的数大,则只找左半边
找出数组中第二大的数
- 假设第一大为第一个数,第二大的数为0
- 比较每个元素若比第二个大比第一大小,赋值给第二大
- 若比第二大和第一大都大,将第一大赋值给第二大,将该数赋值给第一大
- 找不到返回-1
阶乘
- 递归的基本用法
- 递归与减一的数相乘,直到遇到1,返回1不再递归
1. 选择排序
import java.util.Arrays;
public class 选择排序 {
public static void main(String[] args) {
int[] arr={5,4,6,2,1,7,0,9,8,3};
int[] res = sort(arr);
System.out.println(Arrays.toString(res));
}
public static int[] sort(int[] data){
int k=0;
int tmp=0;
for (int i = 0; i < data.length - 1; i++) {
k=i;
for (int j = i+1; j < data.length; j++) {
if (data[j]<data[k]){
k=j;
}
}
if (k!=i){
tmp=data[k];
data[k]=data[i];
data[i]=tmp;
}
}
return data;
}
}
2. 冒泡排序
import org.junit.Test;
import java.util.Arrays;
public class 冒泡排序 {
@Test
public void a1(){
int[] arr=new int[]{5,4,2,6,1,8,9,0,3,7};
System.out.println(Arrays.toString(arr));
int tmp = 0;
for (int j = 0; j <arr.length ; j++) {
for (int i=0;i<arr.length-j-1;i++){
if (arr[i+1]<arr[i]){
tmp=arr[i];
arr[i]=arr[i+1];
arr[i+1]=tmp;
}
}
}
System.out.println(Arrays.toString(arr));
}
@Test
public void a2(){
int[] arr = new int[]{5,6,3,2,1,4,7,0,8,9};
System.out.println(Arrays.toString(arr));
int tmp=0;
for (int i = 0; i < arr.length; i++) {
Boolean flag=true;
for (int j = 0; j < arr.length-i-1; j++) {
if (arr[j]>arr[j+1]){
tmp=arr[j];
arr[j]=arr[j+1];
arr[j+1]=tmp;
flag=false;
}
}
if (flag){
break;
}
}
System.out.println(Arrays.toString(arr));
}
@Test
public void a3(){
int[] arr=new int[]{4,2,3,1,0,7,9,5,6};
int lastindex=0;
int sortborder=arr.length-1;
int tmp=0;
for (int i = 0; i < arr.length; i++) {
boolean flag=true;
for (int j = 0; j < sortborder; j++) {
if (arr[j]>arr[j+1]){
tmp=arr[j];
arr[j]=arr[j+1];
arr[j+1]=tmp;
flag=false;
lastindex=j;
}
}
sortborder=lastindex;
if (flag){
break;
}
}
System.out.println(Arrays.toString(arr));
}
}
3. 快速排序
import java.util.Arrays;
public class 快速排序 {
public static void main(String[] args) {
int[] arr=new int[]{52, 49, 80, 36, 14, 58, 61, 97, 23, 75};
quicksort qk=new quicksort();
qk.arr=arr;
int[] res = qk.sort(0, arr.length - 1);
System.out.println(Arrays.toString(res));
}
static class quicksort{
int[] arr;
int[] sort(int low,int high){
int i,j,t,tmp;
if (low>high){
return arr;
}
i=low;
j=high;
tmp = arr[low];
while (i!=j){
while (i<j && arr[j]>=tmp){
j--;
}
while (i<j && arr[i]<=tmp){
i++;
}
if(i<j){
t=arr[i];
arr[i]=arr[j];
arr[j]=t;
}
}
arr[low]=arr[i];
arr[i]=tmp;
sort(low,i-1);
sort(i+1,high);
return arr;
}
}
}
4. 归并排序
import org.junit.Test;
import java.util.Arrays;
public class 归并排序 {
static int[] sum(int[] a,int alen,int[] b,int blen,int[] c){
int i,j,k;
i=j=k=0;
while (i<alen && j<blen){
if (a[i]<b[j]){
c[k++]=a[i++];
}else {
c[k++]=b[j++];
}
}
while (i<alen){
c[k++]=a[i++];
}
while (j<blen){
c[k++]=b[j++];
}
return c;
}
@Test
public void a1() {
int[] a={1,3,5,7,9};
int[] b={2,4,6,8,10,12,14};
int[] c=new int[a.length+b.length];
int[] sum = sum(a, a.length, b, b.length, c);
System.out.println(Arrays.toString(sum));
}
@Test
public void a2(){
int[] arr={4,5,2,3,6,8,0,9,1,7};
int[] res = merge(arr, 1, arr.length);
System.out.println(Arrays.toString(res));
}
public int[] merge(int[] data,int start,int end){
if (start<end){
int mid=(start+end)/2;
merge(data,start,mid);
merge(data,mid+1,end);
System.out.println(Arrays.toString(data));
part(data,start,mid,end);
}
return data;
}
public void part(int[] data,int start,int mid,int end){
int lena=mid-start+1;
int lenb=end-mid;
int[] A=new int[lena+1];
int[] B=new int[lenb+1];
for (int i = 0; i < lena; i++) {
A[i] = data[i+start-1];
}A[lena]=Integer.MAX_VALUE;
System.out.println("A:"+Arrays.toString(A));
for (int i = 0; i < lenb; i++) {
B[i] = data[i+mid];
}B[lenb]=Integer.MAX_VALUE;
System.out.println("B:"+Arrays.toString(B));
int m=0;
int n=0;
for (int i = start-1; i < end; i++) {
if (A[m]>B[n]){
data[i]=B[n++];
}else {
data[i]=A[m++];
}
}
}
}
5. 二分查找
public class 二分查找 {
public static int a1(int key){
int [] arr=new int[]{0,1,2,3,4,5,6,7,8,9};
int end=arr.length-1;
int start=0;
while (start<=end){
int mid=(end+start)/2;
if (arr[mid]==key){
return mid;
}else if (arr[mid]>key){
end = mid;
}else {
start = mid;
}
}
return -1;
}
public static void main(String[] args) {
int i = a1(4);
System.out.println(i);
}
}
6. 找出数组中第二大的数
import org.junit.Test;
public class 第二大的数 {
@Test
public void a1(){
String str="3 4 2 5 1 6 7 8";
String[] strs = str.split("\\s");
int[] arr=new int[strs.length];
for (int i = 0; i < arr.length; i++) {
arr[i]=Integer.parseInt(strs[i]);
}
int max=arr[0];
int sec=0;
for (int i = 0; i < arr.length; i++) {
if (arr[i]>sec){
if (arr[i]>max){
sec=max;
max=arr[i];
}else {
sec=arr[i];
}
}
}
System.out.println("最大的数:"+max+",第二大的数:"+sec);
}
}
7. 求一个整数的阶乘
public class 阶乘 {
public static int a1(int num){
if (num<=0){
return 0;
}else if (num==1){
return 1;
}else {
return num*a1(num-1);
}
}
public static void main(String[] args) {
int i = a1(3);
System.out.println(i);
}
}