冒泡、选择、插入、计数、快速、归并排序

目录

冒泡排序:

选择排序:

插入排序:

计数排序

快速排序

归并排序

斐波那契数列:


前言:

复习中,总结 一下所有常用的排序算法,有冒泡排序,选择排序,插入排序,快速排序等,最后还总结了一个斐波那契数列前n项的输出算法。

冒泡排序:

package paixu;
/**
 * 相邻的两个数字比较排序,先将最大的交换到最后面,然后重复。
 */
public class BubbleSort {
    public static void main(String[] args) {
        int[] arr = {12,34,643,33,63,235,67};
        int temp;
        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]) {
                    temp = arr[j];
                    arr[j] = arr[j+1];
                    arr[j+1] = temp;
                }
            }
        }
        for(int k : arr) System.out.println(k);
    }
}

选择排序:

package paixu;
/**
 * 从第一个位置开始,用某个位置依次与后边所有元素比较一遍,如果后面的某个位置的数比该位置的数小,就换一换位置。
 */
public class SelectSort {
    public static void main(String[] args) {
        int[] arr = {12,34,643,33,63,235,67};
        int temp;
        for(int i = 0;i<arr.length-1;i++) {    //位置
            for(int j = i+1;j<arr.length;j++) {     //后面所有的元素
                if(arr[j]<arr[i]) {
                    temp = arr[j];
                    arr[j] = arr[i];
                    arr[i] = temp;
                }
            }
        }
        for(int k : arr) System.out.println(k);
    }
}

插入排序:

package paixu;
/**
 * 某个位置 与前边 所有元素比较,
 * 这个位置的元素 比 前边 元素 小,
 * 那么把 这个位置的元素 插入到 比
 * 它大 的那个元素的位置。
 */
public class InsertSort {
    public static void main(String[] args) {
        int[] arr = {12,34,643,33,63,235,67};
        int temp = 0;
        for(int i = 1;i<arr.length;i++) {
            for(int j = 0;j<i;j++) {
                if(arr[i]<arr[j]) {
                    temp = arr[i];
                    for(int k = i;k>j;k--) {
                        arr[k] = arr[k-1];
                    }
                    arr[j] = temp;
                }
            }
        }
        for(int k : arr) System.out.println(k);
    }
}

计数排序

package paixu;

/**
 * 利用数值的下标进行排序
 * 数组的下标是从0开始逐渐递增的,并且有序。
 * 数组的下标存储的是元素的真实值
 * 数组的元素存储的是需要排序的元素出现的次数
 * 
 * 优点:效率高
 * 
 * 缺点:使用范围有限,数组长度不确定
 * 造成空间 浪费  1 3 2 6 9 1000000000
 * 数组的类型不好确定
 */
public class CountSort {

    public static void main(String[] args) {
        int[] arr = {2,1,4,7,2,8,1,5,1};
        int max = arr[0];
        //先得到数组的最大值,作为新的数组的长度
        for(int i =1;i<arr.length;i++) {
            if(arr[i]>max) {
                max=arr[i];
            }
        }
        //定义一个新数组,数组的长度就是旧数组的最大值+1
        int[] newArr = new int[max+1];
        for(int i = 0;i<arr.length;i++) {
            newArr[arr[i]]++;
        }
        //打印输出,新数组存的值是多少,就将该位置的数值打印几次。
        for(int i = 0;i<newArr.length;i++){
            for(int j=0;j<newArr[i];j++){
                System.out.print(i+" ");
            }
        }

    }
}

快速排序

package paixu;

import java.util.Arrays;
/**
 * 对数组排序
   先选取一个基准点,作用:基准点左侧小于基准点的数据,基准点右侧大于基准点的数据
   基准点:最常用的基准点选第一个
    一个大数组不停的进行拆分 拆分的最终结果每个数组只有一个元素
 */
public class QuickSort {
    public static void main(String[] args) {
        int[] arr={1,34,2,5,6,7,8,9,0,10,2,3,4,5};
        sort(arr,0,arr.length-1);
        System.out.println(Arrays.toString(arr));
    }
    //参数
    //出口
    /**
     * @param arr
     * @param left  左侧的元素下标位置
     * @param right  右侧元素的下标
          *  运行的条件   left<right
     */
    public static void sort(int[] arr,int left,int right){
        if(left>right){
            return;
        }
        //符合递归的逻辑的
        //拆分  大数组 按照我们的规则拆分
        //关键找基准点
        int point=getIndexPoint(arr,left,right);
        //进行递归回调
        //先对左侧数组进行回调
        sort(arr,left,point-1);
        //对右侧的数组进行回调
        sort(arr,point+1,right);
        
    }
    //为每一个数组找基准点
    private static int getIndexPoint(int[] arr, int left, int right) {
        //指定初始的基准点
        int key=arr[left];
        while(left<right){
            //从右向左循环
            while(arr[right]>=key&&left<right){
                right--;
            }
            //右侧的数据小于基准点
            arr[left]=arr[right];
            //从左向右进行遍历
            while(arr[left]<=key&&left<right){
                left++;
            }
            arr[right]=arr[left];           
        }
        arr[left]=key;
        return left;
    }
}

归并排序

package paixu;

import java.util.Arrays;
/**
 * 2路归并排序
      做的是两个有序集合的排序
      便于理解   拿两个有序的数组进行排序
      前提:两个数据集都是已经排好序的。只有一个数据集。这个数据集是排好序的
            
      对一个大的数据集进行排序  将大的数据集分成多个小的数据集  这里的多个小的数据集是排好序的
      归并排序进行拆分的时候  拆分的小数据集每个数据集中只有一个元素
      归:拆分的过程
      并:将两两个数据集进行汇笼排序。Merge(文件归并)
 */
public class MergeSortFinal {
    public static void main(String[] args) {
        int[] arr={3,1,2,5,7,5,3,8,7,6,4,8,9,34,56,78,23,12,11};
        int[] newarr=new int[arr.length];
        chai(arr,0,arr.length-1,newarr);
        System.out.println(Arrays.toString(arr));
    }
    //拆分   递归
    public static void chai(int[] arr,int left,int right,int[] newarr){
        if(left>=right){
            return;
        }else{          
            int mid=(left+right)/2; //计算中间值
            //递归调用
            //左半部分
            chai(arr, left, mid,newarr);//边界
            chai(arr,mid+1,right,newarr);//这句代码执行完,整个拆的过程完成
            //并
            mergeResult(arr, left, right, mid, newarr);
        }
    }       
    //并  merge文件归并
    public static void mergeResult(int[] arr,int left,int right,int mid,int[] newarr){
        //定义;两个变量      记录数据集的左侧的边界
        int m=left;
        int n=mid+1;
        //定义两个变量   记录每个数据集的右侧的边界
        int x=mid;
        int y=right;
        //定义一个变量  记录新数组的下标的
        int index=0;
        while(m<=x&&n<=y){
            if(arr[m]<arr[n]){
                newarr[index++]=arr[m++];
            }else{//arr[left]>=arr[mid+1]
                newarr[index++]=arr[n++];;
            }
        }
        while(m<=x){
            newarr[index++]=arr[m++];
        }
        while(n<=y){
            newarr[index++]=arr[n++];
        }
        for(int i=0;i<index;i++){
            arr[i+left]=newarr[i];          
        }       
    }
}

 

斐波那契数列:

package paixu;

import java.util.*;

/**
 * 实现斐波那契数列前n项的输出。
 */
public class Fibonacci{
    static int input;
    public static void main(String[] args){
        Scanner scan = new Scanner(System.in);
        System.out.println("输入要输出菲波那契数列的项数:");
        input = scan.nextInt();     //输入要输出的项数
        for(int i=0;i<input;i++){   //循环输出菲波那契数列
            System.out.print(getfnum(i)+" ");
        }
    }
    //获得菲波那契数列各项的值
    public static long getfnum(int a){
        if(a<2){   //满足这个条件停止递归  递归出口
            return 1;
        }else{
        //在这里我们用到了递归,也就是让getfnum(int a)方法自己再调用自己,直到条件不满足,开始传递数据一层一层归来
            return (getfnum(a-2)+getfnum(a-1));
        }
    }
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值