算法学习<2>---选择排序

简介: 算法学习<2>---选择排序

引言

数据结构和算法对于程序员来说相当重要,我最近打算学习这一门课程,并以博客的形式记录自己的学习过程和心得,目前暂时从两本书入手,一本是《大话数据结构》,一本书《算法图解》,我先从《算法图解》,这本手开始学习吧~。如果你最近也在学习,可以关注一起学习,一起交流哦~

选择排序

学习选择排序算法之前先回顾一下数组和链表的特点:

数组擅长随机读取,而链表擅长插入和删除。

下面是常见数组和链表操作的运行时间。


数组 链表
读取 O(1) O(n)
插入 O(n) O(1)
删除 O(n) O(1)

C语言实现选择排序

#include "stdio.h"
#include "stdlib.h"
#include "string.h"
int arr[10] = {10,9,8,6,7,4,3,1,2,5};
static int smallest;
static int smallest_index = 0;//用于记录最小元素所在位置
//查找数组中最小的元素
int search_min(int *p,int len,int index)
{
  int i;
  smallest = p[index];
  for(i = index; i < len; i++){
    if(p[i] < smallest){
      smallest = p[i];
      smallest_index = i;
    } else if(p[i]==smallest){
      smallest_index = index; 
    }
  } 
  return smallest;
}
//排序函数,将元素从小到大重新排序
int selectionSort(int *p,int len)
{
  int i = 0;
  int smallest;
  static int temp;//临时变量
  for(i = 0; i < len;i++){
    smallest = search_min(p,len,i);//从数组的第i个元素开始向后查找数组找到最小元素
    temp = arr[i]; 
    arr[i] = smallest;  
    arr[smallest_index] = temp; 
  }
}
int main()
{
  int i;
  int res;
  int len;
  smallest = arr[0];
  len = sizeof(arr)/sizeof(arr[0]);
  printf("len = %d\n",len);
  selectionSort(arr,len);//排序
  //打印新的数组元素
  printf("The new arr:\n");
  for(i=0; i<len; i++){
    printf("%d,",arr[i]);
  }
  printf("\n");
}
运行结果
book@book-virtual-machine:~/algo_study/02-selection_sort$ ./test len = 10
The new arr:  
1,2,3,4,5,6,7,8,9,10,
原数组元素:arr[10] = {10,9,8,6,7,4,3,1,2,5}

该排序算法的核心用一张图来表示

640.png640.png

小结

 计算机内存犹如一大堆抽屉。
 需要存储多个元素时,可使用数组或链表。
 数组的元素都在一起。
 链表的元素是分开的,其中每个元素都存储了下一个元素的地址。
 数组的读取速度很快。
 链表的插入和删除速度很快。
 在同一个数组中,所有元素的类型都必须相同(都为int、double等)。

号主:一枚机械专业本科生,经历了转行,从外包逆袭到芯片原厂的Linux驱动开发工程师,深入操作系统的世界,贯彻终身学习、终身成长的理念。平时喜欢折腾,寒冬之下,抱团取暖,期待你来一起探讨技术、搞自媒体副业,程序员接单和投资理财。【对了,不定期送闲置开发板、书籍、键盘等等】。

如果你想了解我的转行经验,欢迎找我交流~gongzhong号【哆哆jarvis】

一起不断探索自我、走出迷茫、找到热爱,希望和你成为朋友,一起成长~

相关文章
|
3天前
|
搜索推荐 算法 Java
Java数据结构与算法:排序算法之选择排序
Java数据结构与算法:排序算法之选择排序
|
13天前
|
存储 算法 Go
算法学习:数组 vs 链表
算法学习:数组 vs 链表
17 0
|
9天前
|
机器学习/深度学习 算法 搜索推荐
数据结构算法--2 冒泡排序,选择排序,插入排序
**基础排序算法包括冒泡排序、选择排序和插入排序。冒泡排序通过相邻元素比较交换,逐步将最大值“冒”到末尾,平均时间复杂度为O(n^2)。选择排序每次找到剩余部分的最小值与未排序部分的第一个元素交换,同样具有O(n^2)的时间复杂度。插入排序则类似玩牌,将新元素插入到已排序部分的正确位置,也是O(n^2)复杂度。这些算法适用于小规模或部分有序的数据。**
|
13天前
|
搜索推荐
排序算法---选择排序-----详解&&代码
排序算法---选择排序-----详解&&代码
|
13天前
|
算法 搜索推荐 JavaScript
算法学习:快速排序
算法学习:快速排序
13 1
|
2天前
|
算法 Java
《JVM由浅入深学习【八】 2024-01-12》JVM由简入深学习提升分(JVM的垃圾回收算法)
《JVM由浅入深学习【八】 2024-01-12》JVM由简入深学习提升分(JVM的垃圾回收算法)
5 0
|
3天前
|
机器学习/深度学习 人工智能 算法
技术经验解读:【转】完美洗牌算法学习
技术经验解读:【转】完美洗牌算法学习
|
6天前
|
搜索推荐 算法
【C/排序算法】:堆排序和选择排序
【C/排序算法】:堆排序和选择排序
7 0
|
11天前
|
机器学习/深度学习 算法 搜索推荐
【机器学习】Apriori算法在关联规则学习中的应用
【机器学习】Apriori算法在关联规则学习中的应用
39 0
|
11天前
|
机器学习/深度学习 算法 数据挖掘
【机器学习】Voting集成学习算法:分类任务中的新利器
【机器学习】Voting集成学习算法:分类任务中的新利器
17 0