C语言直接选择排序算法详解

 更新时间:2022年08月11日 16:16:49   作者:柒号华仔  
直接选择排序就是遍历整个数组,每遍历一遍的目的是找出该数组中的最大数和最小数对应的下标,然后将最小数和数组的第一个数进行交换,最大数和数组的最后一个数进行交换,然后缩小范围再次遍历

1. 直接选择排序介绍

1.1 定义

直接选择排序是指每次都从剩余数据中选出最大或者最小的,将其排在已经排好的有序表后面。

1.2 基本原理

每次从无序表中选择最小(或最大)元素,将其作为首元素,知道所有元素排完为止。将一个有n个元素的数组从小到大排序,第一次从R[0] ~ R[n-1]中选取最小值,与R[0]交换,第二次从R[1] ~ R[n-1]中选取最小值,与R[1]交换,…,第i次从R[i-1] ~ R[n-1]中选取最小值,与R[i-1]交换,…,第n-1次从R[n-2] ~ R[n-1]中选取最小值,与R[ n -2]交换,总共通过n-1次,得到一个按排序码从小到大排列的有序序列。

下面的动图非常清晰的诠释了直接插入排序的过程:

1.3 时间复杂度

最好的情况是数组所有元素已经是有序排列,移动次数为0;

最差的情况是数组所有元素全部反序,移动次数为3(n-1)。

无论最好与最差情况,在排序时所有待排元素均需与后面的元素进行比较,比较次数为:

(n-1)+(n-2)+ …+2+1= n(n-1)/2

因此,直接插入排序的平均时间复杂度为O( n 2 n^2 n2) 。

1.4 空间复杂度

直接选择排序仅需一个存储空间用于记录交换的暂存单元,因此空间复杂度为:O(1) 。

1.5 优缺点

优点:直接选择排序算法简单直观,当待排序记录数量n很小时,局部有序时,较为适用。

缺点:不稳定,由于直接选择排序是以最大或最小值直接与最前方未排序的键值交换,数据排序顺序很有可能被改变。

2. 代码实现

2.1 代码设计

a. 实现直接插入排序需要设计两层循环,整个数组为外循环,后面未排列好的无序元素为内循环;

b. 使用变量minIndex存储最小值的数组元素下标,依次遍历无序元素,找出最小元素下标;

c. 将最小元素与无序元素的首元素进行交换,无序元素个数减1,相应i加1;

d. 重复b和c两步操作,直至i=n-1,即无序元素个数为0,则排序完成。

2.2 代码实现

#include <stdio.h>
void printArray(int array[], int size) {
    int i;
    for (i = 0; i < size; i++) {
        printf("%d ", array[i]);
    }
    printf("\n");
} 
void chooseSort(int array[],int n)
{
    int i,j;
    int minIndex,temp,num;
    for(i=0;i<n-1;i++)
    {
        minIndex=i;
        for(j=i+1;j<n;j++)
        {
            if(array[j]<=array[minIndex])
            {
                minIndex=j;
            }
        }
        if(i!=minIndex)
        {
            temp=array[minIndex];
            array[minIndex]=array[i];
            array[i]=temp;
        }
        printArray(array, n);
    }
}
int main(void)
{
    int array[]={3,44,38,5,47,15,36,26,27,2,46,4,19,50,48};
    printArray(array,sizeof(array)/sizeof(int));
    chooseSort(array,sizeof(array)/sizeof(int));
    printf("\n");
    return 0;
}

运行结果:

3 44 38 5 47 15 36 26 27 2 46 4 19 50 48
2 44 38 5 47 15 36 26 27 3 46 4 19 50 48
2 3 38 5 47 15 36 26 27 44 46 4 19 50 48
2 3 4 5 47 15 36 26 27 44 46 38 19 50 48
2 3 4 5 47 15 36 26 27 44 46 38 19 50 48
2 3 4 5 15 47 36 26 27 44 46 38 19 50 48
2 3 4 5 15 19 36 26 27 44 46 38 47 50 48
2 3 4 5 15 19 26 36 27 44 46 38 47 50 48
2 3 4 5 15 19 26 27 36 44 46 38 47 50 48
2 3 4 5 15 19 26 27 36 44 46 38 47 50 48
2 3 4 5 15 19 26 27 36 38 46 44 47 50 48
2 3 4 5 15 19 26 27 36 38 44 46 47 50 48
2 3 4 5 15 19 26 27 36 38 44 46 47 50 48
2 3 4 5 15 19 26 27 36 38 44 46 47 50 48
2 3 4 5 15 19 26 27 36 38 44 46 47 48 50

到此这篇关于C语言直接选择排序算法详解的文章就介绍到这了,更多相关C语言直接选择排序内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • C++实现LeetCode(126.词语阶梯之二)

    C++实现LeetCode(126.词语阶梯之二)

    这篇文章主要介绍了C++实现LeetCode(126.词语阶梯之二),本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下
    2021-07-07
  • 深入解析C语言中typedef的四个用途

    深入解析C语言中typedef的四个用途

    以下是对C语言中typedef的四个用途进行了详细的分析介绍,需要的朋友可以过来参考下
    2013-08-08
  • 详解C语言中的char数据类型及其与int类型的转换

    详解C语言中的char数据类型及其与int类型的转换

    这篇文章主要介绍了详解C语言中的char数据类型及其与int类型的转换,是C语言入门学习中的基础知识,需要的朋友可以参考下
    2015-08-08
  • C语言详细讲解多维数组与多维指针

    C语言详细讲解多维数组与多维指针

    C 语言中的多维数组(multidimensional array)其实就是元素为数组的数组。多维指针根据声明的维数需要进行多次地址转换才能够取到目标数据。但指针作为数据变量,可以多次赋值,使其成为对数组操作访问的一大利器,所以指针和数组的结合才是重中之重
    2022-04-04
  • C语言中函数的声明、定义及使用的入门教程

    C语言中函数的声明、定义及使用的入门教程

    这篇文章主要介绍了C语言中函数的声明、定义及使用的入门教程,重点讲述了main函数的相关知识,需要的朋友可以参考下
    2015-12-12
  • C++ 11 nullptr 空指针示例详解

    C++ 11 nullptr 空指针示例详解

    C++11标准引入了nullptr来替代传统的NULL,解决了NULL可能导致的类型混淆问题,nullptr是nullptr_t类型的实例,专用于初始化空类型指针,与整型不会发生隐式转换,从而使代码更健壮,它可以被隐式转换为任意类型的指针,提高了代码的安全性和可读性
    2024-10-10
  • C语言入门篇--关键字static详解

    C语言入门篇--关键字static详解

    本篇文章是C语言系列基础篇,C语言中,static是用来修饰变量和函数:1.修饰局部变量–>静态局部变量2.修饰全局变量–>静态全局变量3.修饰函数–>静态函数
    2021-08-08
  • C++详解非类型模板参数Nontype与Template及Parameters的使用

    C++详解非类型模板参数Nontype与Template及Parameters的使用

    除了类型可以作为模板参数,普通值也可以作为模板函数,即非类型模板参数(Nontype Template Parameters)。下面让我们一起了解一下
    2022-06-06
  • 一篇文章带你了解C/C++的回调函数

    一篇文章带你了解C/C++的回调函数

    这篇文章主要为大家介绍了C/C++的回调函数,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助
    2022-01-01
  • c语言中字符串分割函数及实现方法

    c语言中字符串分割函数及实现方法

    下面小编就为大家带来一篇c语言中字符串分割函数及实现方法。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2016-05-05

最新评论