八大排序-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];
     }
 }
相关推荐
陈大爷(有低保)9 分钟前
UDP Socket聊天室(Java)
java·网络协议·udp
秋夫人21 分钟前
B+树(B+TREE)索引
数据结构·算法
kinlon.liu22 分钟前
零信任安全架构--持续验证
java·安全·安全架构·mfa·持续验证
王哲晓43 分钟前
Linux通过yum安装Docker
java·linux·docker
java6666688881 小时前
如何在Java中实现高效的对象映射:Dozer与MapStruct的比较与优化
java·开发语言
Violet永存1 小时前
源码分析:LinkedList
java·开发语言
执键行天涯1 小时前
【经验帖】JAVA中同方法,两次调用Mybatis,一次更新,一次查询,同一事务,第一次修改对第二次的可见性如何
java·数据库·mybatis
梦想科研社1 小时前
【无人机设计与控制】四旋翼无人机俯仰姿态保持模糊PID控制(带说明报告)
开发语言·算法·数学建模·matlab·无人机
Milo_K1 小时前
今日 leetCode 15.三数之和
算法·leetcode
Darling_001 小时前
LeetCode_sql_day28(1767.寻找没有被执行的任务对)
sql·算法·leetcode