数据结构与算法_排序算法_快速排序算法、冒泡排序算法和选择排序算法_JAVA实现

正好做题的时候碰到快速排序,就复习一下,顺带着两个基础排序算法 2020.05.15

先解释一个名称,排序算法的稳定性?当排序后2个相等键值的顺序 和 排序前它们的顺序相同,则表示“稳定”。

快速排序

算法解析:
通过递归的方式,以基准(理论上是任意一个元素,实现时使用下标最小的为基准)为界,将小于基准的移到左边,大于的移到右边,不断递归。
时间复杂度和空间复杂度:
平均时间复杂度O(n log n)
最好时间复杂度O(n log n)
最差时间复杂度O(n的二次方)

空间复杂度O(log n)

排序算法的稳定性:不稳定
原理动画:
在这里插入图片描述
代码实现:

package sort;

public class QuickSort {
    public static void main(String[] args) {
        int[] testArray = {9,7,3,1,8,6,4,2,5,0};
        for (int element : testArray) {
            System.out.print(element + " ");
        }
        quickSort(testArray);
        System.out.println();
        for (int element : testArray) {
            System.out.print(element + " ");
        }
    }
    //判断是否合法,并初始化入参
    public static void quickSort(int[] number) {
        if(number == null || number.length == 0) {
            System.out.println("入参不合法");
            return;
        }
        int low = 0;
        int high = number.length - 1;
        sort(number, low, high);
    }
    
    public static void sort(int[] number,int low,int high) {
        if(low < high) {
            int index = Partition(number, low, high);
            sort(number, low, index-1);
            sort(number, index+1, high);
        }
    }
    //以第一个值为基准,左右分区,左边比基准小,右边比基准大
    public static int Partition(int[] number,int low,int high) {
        //临时缓存基准值,方法最后换到分区中间
        int temp = number[low];
        
        while (low < high) {
            //因为等于在基准左边也行右边也行,就不用考虑等于的情况
            while (temp < number[high] && low < high) {
                high--;       
            }
            
            if(low < high) {
                number[low] = number [high];
                low++;
            }
            
            while (temp > number[low] && low < high) {
                low++;       
            }
            
            if(low < high) {
                number[high] = number [low];
                high--;
            }
        }
        number[low] = temp;
        //返回分区中间值的下标,即当前基准下标
        return low;
    }
}

冒泡排序(未优化与优化)

算法解析:
以升序为例,通过两个循环,第一层循环代表着这个位置,第二层代表着这个从这个位置后的不断比较,如果小与当前位置就交换,然后二次循环继续比较。

优化指的是让,就是在一层循环加一个标记变量,第一种情况,如果二层循环第一次就没有发生交换,说明顺序本身就是排好的;第二种情况,在排序时发现后半部分是已经排好的就不排啦。
时间复杂度和空间复杂度:

平均时间复杂度O(n的二次方)
最好时间复杂度O(n),指的是优化的排序算法
最差时间复杂度O(n的二次方)

空间复杂度O(1),因为只用到一个缓存

排序算法的稳定性:稳定
原理动画:
在这里插入图片描述
未优化代码实现:

package sort;
//冒泡排序
public class BubbleSort {
    public static void main(String[] args) {
        int[] test = {9,7,3,1,8,6,4,5,2};
        for(int i = 0;i < test.length; i++) {
            for(int j = i;j < test.length; j++) {
                //升序:如果上层值比下层值大,将小的值放在上层值的位置上,简单来说就是找最小值放在上层值的位置上
                if(test[i] > test[j]) {
                    int temp = test[i];
                    test[i] = test[j];
                    test[j] = temp;
                }
            }
        }
        for(int value : test)
        System.out.print(value + "\t");
    }  
}

优化代码实现:

package sort;
//优化冒泡排序
public class BubbleSort {
    public static void main(String[] args) {
        int[] test = {9,7,3,1,8,6,4,5,2};
        for(int i = 0;i < test.length; i++) {
            
            boolean mark = false;
            
            for(int j = i;j < test.length; j++) {
                //升序:如果上层值比下层值大,将小的值放在上层值的位置上,简单来说就是找最小值放在上层值的位置上
                if(test[i] > test[j]) {
                    int temp = test[i];
                    test[i] = test[j];
                    test[j] = temp;
                    mark = true;
                }
            }
            
            if(mark == false) {
                return;
            }
        }
        for(int value : test)
        System.out.print(value + "\t");
    }
    
}

选择排序

算法解析:
以升序为例,通过两个循环,第一层循环代表着这个位置,第二层代表着这个从这个位置后的不断比较选出最小的,和冒泡不同的点是,它是标记位置,二层循环结束后换位置。
时间复杂度和空间复杂度:
平均时间复杂度O(n的二次方)
最好时间复杂度O(n的二次方)
最差时间复杂度O(n的二次方)

空间复杂度O(1),因为只用到一个缓存

排序算法的稳定性:不稳定
原理动画:
在这里插入图片描述
代码实现:

package sort;
//选择排序
public class SelectionSort {
    public static void main(String[] args) {
        int[] test = {2,6,4,8,1,5,7,9,3};
        for(int i = 0 ; i < test.length;i++) {
            int index = i;
            for(int j = i ; j < test.length;j++) {
                //注意这个位置是拿标志位去比价,而不像冒泡总是拿当初循环第一个位置
                //升序:如果标识位比当前位值大,说明不是最小值,标记位变成当前位的下标
                if (test[index] > test[j]) {
                    index = j;
                }
            }
            //在外层循环进行交换
            int tempValue = test[index];
            test[index] = test[i];
            test[i] = tempValue;
        }
        for(int value : test) {
            System.out.print(value + "\t");
        }
    }
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java提供了多种数据结构算法排序的实现。以下是一些常见的排序算法: 1. 冒泡排序(Bubble Sort):通过不断比较相邻元素并交换,将最大(或最小)的元素逐渐“冒泡”到最后(或最前)位置。时间复杂度为O(n^2)。 2. 选择排序(Selection Sort):每次选择未排序部分中最小(或最大)的元素,放到已排序部分的末尾(或开头)。时间复杂度为O(n^2)。 3. 插入排序(Insertion Sort):将未排序部分的元素逐个插入已排序部分的正确位置。时间复杂度为O(n^2)。 4. 快速排序(Quick Sort):通过选择一个基准元素,将列表分为两个子列表,其中一个子列表的所有元素都小于(或大于)基准元素,然后递归地排序两个子列表。时间复杂度平情况为O(n log n)。 5. 归并排序(Merge Sort):将列表拆分为多个子列表,递归地对每个子列表进行排序,然后合并这些有序子列表以获得最终有序列表。时间复杂度为O(n log n)。 6. 堆排序(Heap Sort):将待排序元素构建成一个最大(或最小)堆,然后逐个移除堆顶元素并将其放入已排序部分。时间复杂度为O(n log n)。 7. 希尔排序(Shell Sort):将列表按照一定的间隔分组,并对每个分组进行插入排序,然后逐渐缩小间隔,直到间隔为1,最后再进行一次插入排序。时间复杂度取决于间隔序列的选择。 Java中提供了Arrays类和Collections类来对数组和集合进行排序,可以使用它们的sort方法。另外,你也可以自己实现这些排序算法

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值