八大排序-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];
     }
 }
相关推荐
caoerzhong12 小时前
仓库管理数字化趋势解读:JeeWMS 开源 Java WMS 视角下的五个演进方向
java·开源
程序员JerrySUN12 小时前
Jetson Edge AI 实战01:Nano、Xavier、Orin 怎么选?Jetson 硬件选型详解【视频讲解】
java·数据库·redis·安全·mybatis
threerocks12 小时前
Jev 入门第一课
算法
Joy T13 小时前
Spring AI 2.0 Agent 进阶:Memory、State 与 Context Engineering 常见技术全景
java·人工智能·后端·spring·agent入门·agent state
估值探索者13 小时前
【Python量化系统工程化 #08】关了 SSH 就停?systemd 让脚本开机自启 + 异常自动拉起
java·c++·人工智能·分类·数据挖掘
西柚研究生12345613 小时前
论文分析17:YOLOv11_UAVNet:无人机航拍图像专用目标检测算法
人工智能·python·深度学习·算法·目标检测
天若有情67313 小时前
C++花式魔改!手写头文件复刻Java语法,彻底打破编码思维定式
java·c++·语言做语言·jac++
hetao173383714 小时前
2026-09-17 hetao1733837 的刷题记录
c++·算法
午彦琳15 小时前
2026.9.17
数据结构·算法·leetcode
西峰u15 小时前
Java单例模式|从基础到多线程安全
java·java单例模式