基础排序算法(冒泡排序,选择排序,插入排序)

最近经常调用api中的排序算法,很少自己写了,有时候也只写写快速排序这些比较快的排序,然而刚开始学排序时用的一些基本的排序算法却有点忘了

正好今天Java老师让我们每个人写个选择排序热热手,趁这个机会再来复习下一些基本的排序好了。

一、冒泡排序(稳定排序)

学编程接触到的第一个排序算法,基本思路就是,给定一个无序数组a0、a1、a2、a3....an;

通过从左到右相邻的元素两两比较,把最大或者最下的数依次放到数组的右边,最后得到有序的序列

public static void maoPao(int[] arr){
        //遍历数组长度(要冒多少个泡),i从1开始(从0开始也没错)
        for(int i=1;i<arr.length;i++){
            //每冒一次泡,需要比较的元素就少一个,所以是arr.length-i
            for(int j=0;j<arr.length-i;j++){
                //如果满足条件(前面的大于后面的或者后面的大于前面的都行)
                //交换两者
                if(arr[j+1]<arr[j]){
                    //这里交换没有用中间变量
                    arr[j] = arr[j] + arr[j+1];
                    arr[j+1] = arr[j] - arr[j+1];
                    arr[j] = arr[j] - arr[j+1];
                }
            }
        }
    }

二、选择排序(不稳定排序)

给定一个无序的序列a0、a1、a2、a3、a4。。。

下标从小到大遍历数组,每次遍历找到最小的元素并记录下标,如果遍历完之后发现记录的下标不是初始下标则交换

public static void xuanZe(int[] arr){
        for(int i=0;i<arr.length-1;i++){
            int min = i;
            for(int j=i+1;j<arr.length;j++){//找到最小的元素,记录下标
                if(arr[j]<arr[min])
                    min = j;
            }
            if(min!=i){//如果不等于初始状态下标,就交换
                arr[i] = arr[i] + arr[min];
                arr[min] = arr[i] - arr[min];
                arr[i] = arr[i] - arr[min];
            }
        }
    }

三、插入排序(稳定排序)

插入排序的基本思路是将序列中的元素插入有序的序列中,所以可以假定数组中第一个元素为有序,依次遍历,与前面有序的元素依次比较,

找到比自己小(升序)的就在相应的位置插入

public static void chaRu(int[] arr){
        //假定第一个元素是有序的,然后依次插入前面有序的序列
        for(int i=1;i<arr.length;i++){
            //标记待插入元素下标
            int j = i;
            //记录标记元素的值
            int target = arr[i];
            while(j>0&&target<arr[j-1]){
                //如果满足条件,向右移动
                arr[j] = arr[j-1];
                j--;
            }
            //插入数列中
            arr[j] = target;
        }
    }

之前写的插入排序没有用target标记,结果出了很多问题,想了好久才想通,哎,还是太年轻了。。

这是之前写的插入排序

public static void chaRu(int[] arr){
        //假定第一个元素是有序的,然后依次插入前面有序的序列
        for(int i=1;i<arr.length;i++){
            //标记待插入元素下标
            int j = i;
            while(j>0&&arr[i]<arr[j-1]){
                //如果满足条件,向右移动
                arr[j] = arr[j-1];
                j--;
            }
            //插入数列中
            arr[j] = arr[i];
        }
    }

在移动的过程中会改变arr[i]的值,所以会出错。

上面的这些排序时间复杂度相比其他排序都比较高,还有很多改进的地方,这里我就没优化了。。

时间: 2024-10-24 02:59:41

基础排序算法(冒泡排序,选择排序,插入排序)的相关文章

简单排序算法 冒泡排序 选择排序 插入排序

冒泡排序: 总体思路:对未排序的各个元素,依次比较两个元素,如果这两个元素为逆序(与想要的顺序相反),则交换这两个元素. 这样可以有两种排序的思路: 思路一: 固定位置排序:比如有一个未排序队列,下标依次为0,1,2,.....N-1, 第一轮排序:首先固定位置0,将下标为0的元素依次和下标为1.下标为2.....下标为N-1的元素相比较,若相比较的两个元素为逆序,则交换这两个元素,这样第一轮排序完之后,位置为0的元素,就是最大的(最小的). 第二轮排序:首先固定位置1,将下标为1的元素依次和下

数据结构排序算法之选择排序

今天继续介绍一种排序算法:选择排序. 选择排序的基本思想就是从待排序列中选择出最小的,然后将被选出元素和序列的第一个元素互换位置(当前默认是升序排列),则互换完成后第一个元素就是整个序列的最小的元素,则一次选择排序结束.然后我们从剩下的子序列中选择出最小的,然后将该被选出来的元素和该子序列的第一个元素(即整个序列的第二个元素)互换位置,则当前整个序列的第二个元素就是当前序列中的次最小值,第二次选择排序结束.以此类推,直到该待排序列只剩下一个元素后,则整个序列有序. 具体过程如下图所示: 下面就不

排序算法之选择排序

一. 算法描述 选择排序:在一个长度为N的无序数组中,在第一趟遍历N个数据,找出其中最小的数值与第一个元素交换,第二趟遍历剩下的N-1个数据,找出其中最小的数值与第二个元素交换......第N-1趟遍历剩下的2个数据,找出其中最小的数值与第N-1个元素交换,至此选择排序完成. 二. 算法分析 平均时间复杂度:O(n2) 空间复杂度:O(1)  (用于交换和记录索引) 稳定性:不稳定 (比如序列[5, 5, 3]第一趟就将第一个[5]与[3]交换,导致第一个5挪动到第二个5后面) 三. 算法实现

经典排序:冒泡排序+选择排序 小结

经典排序:冒泡排序+选择排序 例 FJUTOJ 1842 冒泡排序 原理是取相邻两个数进行大小比较,判断是否交换. 以从小到大排序为例,冒泡排序就像气泡一样,最小的数慢慢浮上来,最大的数慢慢沉下去.那么完整从头到尾做一次之后最后一位就是原序列中最大的数字了.然后只需要对1~(n-1)个数字进行排序,完成后倒数第二个数字也为原序列的1~n-1元素中最大的值.如此重复,进行n-1次一定能完成排序.参考代码: 1 #include <stdio.h> 2 void BubbleSort(int *,

【排序算法】选择排序(Selection sort)

0. 说明 选择排序(Selection sort)是一种简单直观的排序算法. 它的工作原理如下. 首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置,然后,再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾.以此类推,直到所有元素均排序完毕. 选择排序的主要优点与数据移动有关.如果某个元素位于正确的最终位置上,则它不会被移动.选择排序每次交换一对元素,它们当中至少有一个将被移到其最终位置上,因此对 n 个元素的表进行排序总共进行至多 n-1 次交换.在所有的完全依

初级排序算法之选择排序

初级排序算法 本质是对要排序的数组进行嵌套循环,内层循环负责局部的排序,外层循环负责剩余的无序元素的递减.所以你只要理解嵌套循环和比较大小就能很快的掌握初级排序算法. 选择排序 一个无序的数组 a = [0, 4, 6, 3, 8, 2, 3, 9], 你也可以把a的元素想象成任何现实中可比较的具体物体.例如,有10根长短不一的木条,我们如何对它们进行排序?一个最直接的思想,先拿出最短的放到最前面,在剩余的木条中再拿出最短的放在第二位...直到最后一根木条.从中我们可以看出,1. 我们需要再一次

【排序算法】选择排序

选择排序算法原理 选择排序算法时间复杂度分析 选择排序算法稳定性分析 选择排序算法C语言代码 #include <stdio.h> //交换两个元素的值 void swap(int* a, int* b) { int temp; temp = *a; *a = *b; *b = temp; } void selectionSort(int arr[], int length) { int i, j, maxIndex; for(i = length; i > 0; i--) { //假设

排序算法总结------选择排序 ---javascript描述

每当面试时避不可少谈论的话题是排序算法,上次面试时被问到写排序算法,然后脑袋一懵不会写,狠狠的被面试官鄙视了一番,问我是不是第一次参加面试,怎么可以连排序算法都不会呢?不过当时确实是第一次去面试,以此恶补排序算法. 一.基本排序算法:基本排序算法有冒泡排序,选择排序,插入排序. 选择排序算法思想:选择排序从数组的头开始,将第一个元素与其他元素进行比较,找到最小的元素,然后放到数组的第一个位置.然后再从第二个元素开始找比他小的元素,放到第二个位置,以此类推,重复上述步骤,当进行到数组的第二个位置时

选择排序算法---直接选择排序和堆排序

本文主要是解析选择排序算法:直接选择排序和堆排序. 一.直接选择排序   基本思想:       选择排序(Selection sort)是一种简单直观的排序算法.它的工作原理如下.首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置,然后,再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾.以此类推,直到所有元素均排序完毕. 选择排序的主要优点与数据移动有关.如果某个元素位于正确的最终位置上,则它不会被移动.选择排序每次交换一对元素,它们当中至少有一个将被移到其最终

[排序算法二]选择排序

选择排序(Selection sort)是一种简单直观的排序算法.它的工作原理是:第一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,然后再从剩余的未排序元素中寻找到最小(大)元素,然后放到已排序的序列的末尾.以此类推,直到全部待排序的数据元素的个数为零.选择排序是不稳定的排序方法. 算法性能 时间复杂度:O(n^2),总循环次数 n(n-1)/2.数据交换次数 O(n),这点上来说比冒泡排序要好,因为冒泡是把数据一位一位的移上来,而选择排序只需要在子循环结束后移动一次