排序算法(冒泡排序,选择排序,插入排序,快速排序)

数组的排序算法

选择排序

每次选择所要排序得数组中的最大值(由大到小排序,由小到大排序则选择最小值)的数组元素,将这个数组元组的值与最前面没有排序的数组元素进行交换,

第一次排序之后,最大的数字来到了第一位,再从第二个元素开始找,找到最大的元素,与第二个交换位置


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

#include <stdio.h>

int main(int argc, char *argv[])

{

    int i,j;

    int a[10];

    int temp;

    int index;

    printf("为数组元素赋值\n");

    for(i=0;i<10;i++){

        printf("a[%d]=",i);

        scanf("%d",&a[i]);

    }

    for(i=0;i<9;i++){//外层循环0~8这9个元素

        temp=a[i]; //假设最大值

        index=i; // 记录假设最大值索引

        for(j=i+1;j<10;j++){// 内层循环,排序后的元素

            if(a[j]>temp){//取最大值

                temp=a[j]; //重置最大值

                index=j; //重置最大值索引

            }

        }

        // 交换元素位置

        a[index]=a[i];

        a[i]=temp;

    }

    

    // 输出数组

    for(i=0;i<10;i++){

        printf("%d\t",a[i]);

        if(i==4){ //输出换行

        

        printf("\n");

        }

        }

    return 0;

}

python做选择排序


1

2

3

4

5

6

7

8

9

# 扫描无序区,从无序区中找出一个极端值,放入有序区

def select_sort(li): # 选择

    for in range(len(li)-1): # i表示第几次,有多少元素我就要扫几-1次

        # 找无序区最小值,保存最小值的位置

        min_pos = i     # 假设起始值最小,min_pos保存最小值的索引

        for in range(i+1len(li)): # 第i趟开始时 无序区:li[i:],自己不与自己比较,所以i+1

            if li[j] < li[min_pos]: # 满足条件,我存的值比后面的值大,则把后面的值的所以设置为最小值索引

                min_pos = j

        li[min_pos], li[i] = li[i], li[min_pos] # 交换两个值的位置

冒泡排序

每次比较相邻的两个数,将最小的数(从小到大排序)排在较大的数前面.

经过一次排序之后最小的数到达了最前面的位置,并将其他的数字依次向后移动,第二次排序时,将从第二个数开始最小的数移动到第二的位置,依次类推


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

#include <stdio.h>

 

int main(int argc, char *argv[])

{

    int i,j;

    int a[10];

    int temp;

    printf("为数组元素赋值\n");

    for(i=0;i<10;i++){

        printf("a[%d]=",i);

        scanf("%d",&a[i]);

    }

    for(i=1;i<10;i++){//外层循环1~9这9个元素

        for(j=9;j>=i;j--){//从后向前循环i后面的元素

        if(a[j]<a[j-1]){//前面的数大于后面的数,交换

            temp=a[j-1];

            a[j-1]=a[j];

            a[j]=temp;

            }

        }

    }

    

    // 输出数组

    for(i=0;i<10;i++){

        printf("%d\t",a[i]);

        if(i==4){ //输出换行

        

        printf("\n");

            }

        }

    return 0;

}

python做冒泡排序


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

# 冒泡排序,一遍遍扫描未归位区,比较相邻的两个数字,满足条件则交换,每次使一个元素归位

def bubble_sort(li): # 冒泡

    for in range(len(li)-1): # i表示第几次,有多少元素我就要扫几-1次

        for in range(len(li)-i-1): # 比较元素的位置,len(li)-1-i是未归位区的最大索引

            if li[j] > li[j+1]: # 满足条件 将两个数值交换,这里是前面比后面大

                li[j], li[j+1= li[j+1], li[j]

def bubble_sort_1(li): # 优化冒泡

    for in range(len(li)-1): # i表示第几次,有多少元素我就要扫几次

        exchange = False # 增加了一个标志位,如果依次循环中没有发生交换,则顺序已经是有序的了,可以直接退出

        for in range(len(li)-i-1): # 比较元素的位置,len(li)-1-i是未归位区的最大索引

            if li[j] > li[j+1]:

                li[j], li[j+1= li[j+1], li[j]

                exchange = True

        if not exchange:

            return

插入排序

插入排序就像是摸扑克,第一张算是有序区,从后面的无序区拿扑克向有序区中插

python


1

2

3

4

5

6

7

8

9

10

def insert_sort(li):  # 插入

    for in range(1len(li)): # i是摸到的牌的下标,第一个属于有序区,所以从第二个开始

        tmp = li[i] # 手里牌的大小

        = - 1 # j是手里最后一张牌的下标

        # 如果tmp大于我手里第j个元素,他就应该放在第j个位置上,如果小于就继续向前比较

        while j >= 0 and li[j] > tmp:   # 两个终止条件:j小于0表示tmp是最小的 顺序不要乱

            # 因为保存了i索引位置的值,所以大于tmp的数都向后移动一位,j自减

            li[j+1= li[j]

            -= 1

        li[j+1= tmp

快速排序

快排采用的递归的思路
是以一个数字为基准(第0个元素),将列表分为大于他的和小于他的两部分,递归进行直至列表少于一个元素


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

def partition(li, left, right): # 归位

    # randi = random.randint(left, right)

    # li[randi], li[left] = li[left], li[randi]

    ‘‘‘

    将一个列表分成左右两部分

    :param li: 列表

    :param left: 开始索引

    :param right: 结束索引

    :return: 返回中间索引

    ‘‘‘

    tmp = li[left] # 取最左边的值,作为中间值

    while left < right: # 左索引一定要小于右索引,

        while left < right and li[right] >= tmp:

            # 从后向前找一个小于tmp的元素,找不到就将索引-1向前找

            # = tmp可以使right的值是tmp左边的索引

            right -= 1

        li[left] = li[right] # 找到之后放到最左边 ,此时right位置的值有两个,

        while left < right and li[left] <= tmp:

            # 在从前往后找一个比tmp大的,找不到就将索引+1向后找

            # = tmp可以使right的值是tmp右边的索引

            left += 1

        li[right] = li[left] # 找到之后放到right位置,

    # 当左右索引位置重合时循环结束

    li[left] = tmp

    return left

def _quick_sort(li, left, right): # 递归

    if left < right:    # 至少两个元素

        mid = partition(li, left, right) # 取中间索引,将两面进行递归

        _quick_sort(li, left, mid - 1)

        _quick_sort(li, mid + 1, right)

归位图解

分类: 算法

原文地址:https://www.cnblogs.com/QQ279366/p/8963561.html

时间: 2024-09-29 19:43:20

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

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

冒泡排序: 总体思路:对未排序的各个元素,依次比较两个元素,如果这两个元素为逆序(与想要的顺序相反),则交换这两个元素. 这样可以有两种排序的思路: 思路一: 固定位置排序:比如有一个未排序队列,下标依次为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),这点上来说比冒泡排序要好,因为冒泡是把数据一位一位的移上来,而选择排序只需要在子循环结束后移动一次