IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> 1基本排序算法 -> 正文阅读

[数据结构与算法]1基本排序算法

1、复杂度

1.1时间复杂度

时间复杂度是指执行某个算法所需要的计算工作量,写作T(n)=O(f(n)),当f(n)相等时,需要在相同的情况下计算具体的运行时间来比较两个算法的优劣,常见的有:

  • 常数时间复杂度
  • 对数时间复杂度
  • 次方时间复杂度
  • 线性时间复杂度
  • 线性对数时间复杂度
  • 质数时间复杂度

1.2空间复杂度

空间复杂度是对一个算法在运行过程中临时占用存储空间大小的量度,写作S(n)=O(f(n))。

2、异或运算

异或运算可以理解为一种无进位相加,常用规则有:

  • 0 ^ N = N ; N ^ N = 0
  • 交换律结合律:a ^ b = b ^ a ; (a ^ b) ^ c = a ^ (b ^ c)
  • 同一组数异或结果与顺序无关

例一:一组数中,已知有一种数的出现次数为奇数,其他类型的数出现的次数为偶数,求出现次数为奇数的数。

public static int test1(int[] arr, int n) {
    int temp=0;//临时变量,用来储存异或结果
    
    for (int i=0; i<n; i++) {
        //N ^ N = 0
        temp = temp ^ arr[i];
    }

    return  temp;
}

例二:一组数中,已知有两种数的出现次数为奇数,其他类型的数出现的次数为偶数,求出现次数为奇数的两个数。

public static void test2(int[] arr, int n) {
    int temp=0;//临时变量,用来储存异或结果
    int i=0;//循环变量
    int a=0,b=0;//两个奇数

    for (i=0; i<n; i++) {
        //N ^ N = 0
        temp = temp ^ arr[i];//temp = a ^ b;
    }

    //取最左边的1
    int left = temp & ( ~temp + 1);
    //与该位为1的数相异或得到其中一个数
    for (i=0; i<n; i++) {
        if((arr[i] & left) == 1) {
            a ^= arr[i];
        }
    }
    b = a ^temp;

    System.out.println("a = "+a+"\nb = "+b);
}

3、基本排序算法

3.1选择排序

时间复杂度O(n^2),空间复杂度O(1),稳定排序。

	//选择排序
	public static int[] selectSort(int[] arr) {
        int n = arr.length;//数组长度
        int i,j;//循环变量
        int min;//局部最小值

        for(i = 1; i<n; i++) {
            min = i-1;
            for(j=i; j<n; j++) {
                if(arr[j]<arr[min]) {
                    min = j;
                }
            }
            if(min!=(i-1)) {
                //相加后减交换法
                arr[i-1] = arr[i-1] + arr[min];
                arr[min] = arr[i-1] - arr[min];
                arr[i-1] = arr[i-1] - arr[min];
            }
        }

        return arr;
    }

3.2冒泡排序

时间复杂度O(n^2),空间复杂度O(1),稳定排序。

	//冒泡排序
    public static int[] bubblingSort(int[] arr) {
        int n = arr.length;//数组长度
        int i,j;//循环变量

        for(i=0; i<n-1; i++) {
            for (j=0; j<n-i-1; j++) {
                if(arr[j]>arr[j+1]) {
                    //异或交换法
                    arr[j] = arr[j] ^ arr[j+1];
                    arr[j+1] = arr[j] ^ arr[j+1];
                    arr[j] = arr[j] ^ arr[j+1];
                }
            }
        }

        return arr;
    }

3.3插入排序

时间复杂度O(n^2),空间复杂度O(1),稳定排序。

	//插入排序
    public static int[] insertSort(int[] arr) {
        int n = arr.length;//数组长度
        int i,j;//循环变量
        int temp;//临时变量

        for(i=1;i<n;i++) {
            j = i;
            while(j>0&&(arr[j-1]>arr[j])) {
                temp = arr[j];
                arr[j] = arr[j-1];
                arr[j-1] = temp;
                j--;
            }
        }

        return arr;
    }
            arr[j] = arr[j-1];
            arr[j-1] = temp;
            j--;
        }
    }

    return arr;
}

  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2021-09-08 10:59:23  更:2021-09-08 11:00:14 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年12日历 -2024/12/30 0:52:20-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码