引言
数据结构和算法对于程序员来说相当重要,我最近打算学习这一门课程,并以博客的形式记录自己的学习过程和心得,目前暂时从两本书入手,一本是《大话数据结构》,一本书《算法图解》,我先从《算法图解》,这本手开始学习吧~。如果你最近也在学习,可以关注一起学习,一起交流哦~
选择排序
学习选择排序算法之前先回顾一下数组和链表的特点:
数组擅长随机读取,而链表擅长插入和删除。
下面是常见数组和链表操作的运行时间。
数组 | 链表 | |
读取 | 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}
该排序算法的核心用一张图来表示
小结
计算机内存犹如一大堆抽屉。 需要存储多个元素时,可使用数组或链表。 数组的元素都在一起。 链表的元素是分开的,其中每个元素都存储了下一个元素的地址。 数组的读取速度很快。 链表的插入和删除速度很快。 在同一个数组中,所有元素的类型都必须相同(都为int、double等)。
号主:一枚机械专业本科生,经历了转行,从外包逆袭到芯片原厂的Linux驱动开发工程师,深入操作系统的世界,贯彻终身学习、终身成长的理念。平时喜欢折腾,寒冬之下,抱团取暖,期待你来一起探讨技术、搞自媒体副业,程序员接单和投资理财。【对了,不定期送闲置开发板、书籍、键盘等等】。
如果你想了解我的转行经验,欢迎找我交流~gongzhong号【哆哆jarvis】
一起不断探索自我、走出迷茫、找到热爱,希望和你成为朋友,一起成长~