排序-JAVA

排序
排序,就是使一串记录,按照其中的某个或某些关键字的大小,递增或递减的排列起来的操作。
常见排序算法:插入排序(直接插入排序、希尔排序)
选择排序(选择排序、堆排序)
交换排序(冒泡排序、)
归并排序(归并排序)
直接插入排序【插入排序,初始数据越接近有序,时间效率越高。】
整个区间被分为 有序区间和无序区间每次选择无序区间的第一个元素,在有序区间内选择合适的位置插入。

public static void insertSort(int[] array) { 
    for (int i = 1; i < array.length; i++) { 
    // 有序区间: [0, i) 
    // 无序区间: [i, array.length) int v = array[i]; 
    // 无序区间的第一个数 int j = i - 1;
    // 不写 array[j] == v 是保证排序的稳定性 
    for (; j >= 0 && array[j] > v; j--) {
         array[j + 1] = array[j];
          } 
          array[j + 1] = v; 
    }
 }

时间复杂度:最好【O(n)】;最坏【O(n^2) 】平均【O(n^2) 】
空间复杂度:O(1);
稳定性:稳定
插入排序,初始数据越接近有序,时间效率越高。
希尔排序(基于插入排序的优化)
希尔排序法又称缩小增量法。希尔排序法的基本思想是:先选定一个整数,把待排序文件中所有记录分成个组,所 有距离为的记录分在同一组内,并对每一组内的记录进行排序。然后,取,重复上述分组和排序的工作。当到达=1 时,所有记录在统一组内排好序。

  1. 希尔排序是对直接插入排序的优化。
  2. 当gap > 1时都是预排序,目的是让数组更接近于有序。当gap == 1时,数组已经接近有序的了,这样就会很 快。这样整体而言,可以达到优化的效果。我们实现后可以进行性能测试的对比。
public static void shellSort(int[] array) {
    int gap = array.length;
    while (gap > 1) {
        insertSortGap(array, gap);
        gap = (gap / 3) + 1; // OR gap = gap / 2;
    }
    insertSortGap(array, 1);
}
//直接插入排序
private static void insertSortGap(int[] array, int gap) {
    for (int i = 1; i < array.length; i++) {
        int v = array[i];
        int j = i - gap;
            for (; j >= 0 && array[j] > v; j -= gap) {
                array[j + gap] = array[j];
            }
        array[j + gap] = v;
    }
}

时间复杂度:最好O(n) 平均O(n^1.3) 最坏O(n^2)
空间复杂度: O(1)
稳定性:不稳定
选择排序
每一次从无序区间选出最大(或最小)的一个元素,存放在无序区间的最后(或最前),直到全部待排序的数据元 素排完 。

public static void selectSort(int[] array) {
    for (int i = 0; i < array.length - 1; i++) {
    // 无序区间: [0, array.length - i)
    // 有序区间: [array.length - i, array.length)
    int max = 0;
        for (int j = 1; j < array.length - i; j++) {
        if (array[j] > array[max]) {
            max = j;
        }
     }
    int t = array[max];
    array[max] = array[array.length - i - 1];
    array[array.length - i - 1] = t;
    }
}

时间复杂度 O(n^2)
空间复杂度 O(1)
稳定性:不稳定
堆排序
基本原理也是选择排序,只是不在使用遍历的方式查找无序区间的最大的数,而是通过堆来选择无序区间的最大的 数。
注意: 排升序要建大堆;排降序要建小堆。

public static void heapSort(int[] array) {
    createHeap(array);
    for (int i = 0; i < array.length - 1; i++) {
    // 交换前
    // 无序区间: [0, array.length - i)
    // 有序区间: [array.length - i, array.length)
    swap(array, 0, array.length - 1);
    // 交换后
    // 无序区间: [0, array.length - i - 1)
    // 有序区间: [array.length - i - 1, array.length)
    // 无序区间长度: array.length - i - 1
    shiftDown(array, array.length - i - 1, 0);
    }
}
private void swap(int[] array, int i, int j) {
    int t = array[i];
    array[i] = array[j];
    array[j] = t;
}
private void createHeap(int[] array) {
    for (int i = (array.length - 1) / 2; i >= 0; i--) {
        shiftDown(array, array.length, i);
    }
}
public static void shiftDown(int[] array, int size, int index) {
    int left = 2 * index + 1;
    while (left < size) {
        int max = left;
        int right = 2 * index + 2;
        if (right < size) {
            if (array[right] > array[left]) {
            max = right;
            }
        }
        if (array[index] >= array[max]) {
            break;
        }
    int t = array[index];
    array[index] = array[max];
    array[max] = t;
    index = max;
    left = 2 * index + 1;
    }
}

时间复杂度O(n * log(n))
空间复杂度 O(1)
稳定性:不稳定
冒泡排序
在无序区间,通过相邻数的比较,将最大的数冒泡到无序区间的最后,持续这个过程,直到数组整体有序

public static void bubbleSort(int[] array) {
    for (int i = 0; i < array.length - 1; i++) {
            boolean isSorted = true;
                    for (int j = 0; j < array.length - i - 1; j++) {            // 相等不交换,保证稳定性           
                     if (array[j] > array[j + 1]) {    
                            swap(array, j, j + 1);
                             isSorted = false;         
                                }       
                                 } 
                  if (isSorted) {
                              break;       
                     }    
        } 
}

时间复杂度:最好O(n) 平均 O(n^2) 最坏 O(n^2)
空间复杂度:O(1)
稳定性:稳定

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
探索全栈前端技术的魅力:HTML+CSS+JS+JQ+Bootstrap网站源码深度解析 在这个数字化时代,构建一个既美观又功能强大的网站成为了许多开发者和企业追逐的目标。本份资源精心汇集了一套完整网站源码,融合了HTML的骨架搭建、CSS的视觉美化、JavaScript的交互逻辑、jQuery的高效操作以及Bootstrap的响应式设计,全方位揭秘了现代网页开发的精髓。 HTML,作为网页的基础,它构建了信息的框架;CSS则赋予网页生动的外观,让设计创意跃然屏上;JavaScript的加入,使网站拥有了灵动的交互体验;jQuery,作为JavaScript的强力辅助,简化了DOM操作与事件处理,让编码更为高效;而Bootstrap的融入,则确保了网站在不同设备上的完美呈现,响应式设计让访问无界限。 通过这份源码,你将: 学习如何高效组织HTML结构,提升页面加载速度与SEO友好度; 掌握CSS高级技巧,如Flexbox与Grid布局,打造适应各种屏幕的视觉盛宴; 理解JavaScript核心概念,动手实现动画、表单验证等动态效果; 利用jQuery插件快速增强用户体验,实现滑动效果、Ajax请求等; 深入Bootstrap框架,掌握移动优先的开发策略,响应式设计信手拈来。 无论是前端开发新手渴望系统学习,还是资深开发者寻求灵感与实用技巧,这份资源都是不可多得的宝藏。立即深入了解,开启你的全栈前端探索之旅,让每一个网页都成为技术与艺术的完美融合!
探索全栈前端技术的魅力:HTML+CSS+JS+JQ+Bootstrap网站源码深度解析 在这个数字化时代,构建一个既美观又功能强大的网站成为了许多开发者和企业追逐的目标。本份资源精心汇集了一套完整网站源码,融合了HTML的骨架搭建、CSS的视觉美化、JavaScript的交互逻辑、jQuery的高效操作以及Bootstrap的响应式设计,全方位揭秘了现代网页开发的精髓。 HTML,作为网页的基础,它构建了信息的框架;CSS则赋予网页生动的外观,让设计创意跃然屏上;JavaScript的加入,使网站拥有了灵动的交互体验;jQuery,作为JavaScript的强力辅助,简化了DOM操作与事件处理,让编码更为高效;而Bootstrap的融入,则确保了网站在不同设备上的完美呈现,响应式设计让访问无界限。 通过这份源码,你将: 学习如何高效组织HTML结构,提升页面加载速度与SEO友好度; 掌握CSS高级技巧,如Flexbox与Grid布局,打造适应各种屏幕的视觉盛宴; 理解JavaScript核心概念,动手实现动画、表单验证等动态效果; 利用jQuery插件快速增强用户体验,实现滑动效果、Ajax请求等; 深入Bootstrap框架,掌握移动优先的开发策略,响应式设计信手拈来。 无论是前端开发新手渴望系统学习,还是资深开发者寻求灵感与实用技巧,这份资源都是不可多得的宝藏。立即深入了解,开启你的全栈前端探索之旅,让每一个网页都成为技术与艺术的完美融合!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值