vlambda博客
学习文章列表

算法学习<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");

}

运行结果

原数组元素:arr[10] = {10,9,8,6,7,4,3,1,2,5}

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

小结

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