八大排序-01

1.选择排序(Selection Sort)

基本思想:每一次从待排序的数据元素中选出最小的一个元素,存放在序列的起始位置,直到全部待排序的数据元素排完。
时间复杂度:O(n^2)。
空间复杂度:O(1)。
稳定性:不稳定。
java 复制代码
 public static void xz(int[] arr){
    int n=arr.length;
     for(int i=0;i<n;i++){
        int min=arr[i];
        int index=i;

       //找到最小的
       for(int j=i+1;j<n;j++){
             if(arr[j]<min){
                min=arr[j];
               index=j;
             }
      }
         arr[index]=arr[i];
         arr[i]=min;
     }
 }

2. 冒泡排序(Bubble Sort)

基本思想:重复地遍历要排序的数列,一次比较两个元素(挨着的),如果它们的顺序错误就把它们交换过来。遍历数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。
时间复杂度:O(n^2)。
空间复杂度:O(1)。
稳定性:稳定。
java 复制代码
 public class mp {
    /**
     * 冒泡排序
     * 每次比较相邻的两个数,前者比后者大,两两交换,第一次排序进行n次
     * 第二次排序进行n-1次,以此类推,直到排序完成
     * 时间复杂度o(n^2 ) 空间复杂度o(1)
     */
    public static void main(String[] args) {
        int arr ={2,4,3,1,6,2,9,8};
        mp(arr);
        System.out.println(Arrays.toString(arr));
    }
   public static void mp(intarr){
        int n=arr.length;
        for(int i=0;i<n;i++){
            for(int j=0;j<n-1-i;j++){
                if(arr[j]>arr[j+1]){
                    int tmp=arr[j];
                    arr[j]=arr[j+1];
                    arr[j+1]=tmp;
                }
            }
        }
   }
}

3. 快速排序(Quick Sort)

基本思想:通过一趟排序将待排记录分隔成独立的两部分,其中一部分记录的关键字均比另一部分的关键字小,则可分别对这两部分记录继续进行排序,以达到整个序列有序。
时间复杂度:平均时间复杂度为O(nlogn),最坏情况下为O(n^2)。
空间复杂度:取决于递归的深度,平均情况下为O(logn),最坏情况下为O(n)。
稳定性:不稳定。
java 复制代码
public static void kp(intarr,int left,int right){
    if(left>=right)
        return ;
    int t=arr[left];
    int i=left;
    int j=right;
    while(i!=j){
        while (arr[j]>=t&&i<j){
            j--;
        }
        while(arr[i]<=t&&i<j){
            i++;
        }
        int tmp=arr[i];
        arr[i]=arr[j];
        arr[j]=tmp;
    }
    //交换两者位置
    arr[left]=arr[i];
    arr[i]=t;
    kp(arr,left,i-1);
    kp(arr,i+1,right);
}

4.归并排序(Merge Sort)

基本思想:建立在归并操作上的一种有效的排序算法。该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。
时间复杂度:O(nlogn)。
空间复杂度:O(n),因为需要用到与输入数组等长的额外空间来进行合并操作。
稳定性:稳定。
java 复制代码
 public static void split(intarr,int left,int right) {
     if(left==right){
         return;
     }
    int mid=(left+right)/2;
    split(arr,left,mid);
    split(arr,mid+1,right);
   merge(arr,left,mid,right);
 }

 //合并
 public static void merge(int[]arr,int left,int mid,int right) {
     //创建临时数组
   inttmp=new int[right-left+1];
   int s1=left;
   int s2=mid+1;
   int t=0;
   while(s1<=mid&&s2<=right){
       if(arr[s1]>arr[s2]){
           tmp[t]=arr[s2];
           s2++;
           t++;
       }else{
           tmp[t]=arr[s1];
           s1++;
           t++;
       }
   }
  //考虑有一边结束的情况
     while(s2<=right){
         tmp[t]=arr[s2];
         s2++;
         t++;
     }
     while(s1<=mid){
         tmp[t]=arr[s1];
         t++;
         s1++;
     }
     //把临时数组当中的数据放回原数组
     for(int j=0;j<tmp.length;j++) {
         arr[left+j]=tmp[j];
     }
 }
相关推荐
南山十一少1 小时前
Spring Security+JWT+Redis实现项目级前后端分离认证授权
java·spring·bootstrap
427724003 小时前
IDEA使用git不提示账号密码登录,而是输入token问题解决
java·git·intellij-idea
chengooooooo3 小时前
苍穹外卖day8 地址上传 用户下单 订单支付
java·服务器·数据库
李长渊哦3 小时前
常用的 JVM 参数:配置与优化指南
java·jvm
计算机小白一个3 小时前
蓝桥杯 Java B 组之设计 LRU 缓存
java·算法·蓝桥杯
万事可爱^4 小时前
HDBSCAN:密度自适应的层次聚类算法解析与实践
算法·机器学习·数据挖掘·聚类·hdbscan
大数据追光猿6 小时前
Python应用算法之贪心算法理解和实践
大数据·开发语言·人工智能·python·深度学习·算法·贪心算法
Dream it possible!6 小时前
LeetCode 热题 100_在排序数组中查找元素的第一个和最后一个位置(65_34_中等_C++)(二分查找)(一次二分查找+挨个搜索;两次二分查找)
c++·算法·leetcode
夏末秋也凉6 小时前
力扣-回溯-46 全排列
数据结构·算法·leetcode
南宫生6 小时前
力扣每日一题【算法学习day.132】
java·学习·算法·leetcode