目录

数组和链表

选择排序

需要检查的元素数越来越少

小结

示例代码

C

C++11

C#

Python

JAVA

JS



数组和链表


数组和链表哪个用得更多呢?显然要看情况。但数组用得很多,因为它支持随机访问。有两
种访问方式: 随机访问和顺序访问。顺序访问意味着从第一个元素开始逐个地读取元素。链表只
能顺序访问:要读取链表的第十个元素,得先读取前九个元素,并沿链接找到第十个元素。随机
访问意味着可直接跳到第十个元素。本书经常说数组的读取速度更快,这是因为它们支持随机访
问。很多情况都要求能够随机访问,因此数组用得很多。


选择排序


需要检查的元素数越来越少

随着排序的进行,每次需要检查的元素数在逐渐减少,最后一次需要检查的元素都只有一
个。既然如此,运行时间怎么还是O(n2)呢?这个问题问得好,这与大O表示法中的常数相关。
第4章将详细解释,这里只简单地说一说。
你说得没错,并非每次都需要检查n个元素。第一次需要检查n个元素,但随后检查的元素
数依次为n  1, n – 2, …, 2和1。平均每次检查的元素数为1/2 × n, 因此运行时间为O(n × 1/2 × n)。
但大O表示法省略诸如1/2这样的常数(有关这方面的完整讨论,请参阅第4章),因此简单地写
作O(n × n)或O(n2)。

小结


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


示例代码


C


#include <stdio.h>
#include <stdlib.h>
#define SIZE 5// Finds the smallest value in an array
int findSmallest(int *arr) {// Stores the smallest valueint smallest = arr[0];// Stores the index of the smallest valueint smallest_index = 0;for (int i = 1; i < SIZE; i++) {if (arr[i] < smallest) {smallest = arr[i];smallest_index = i;}}return smallest_index;
}int *selectionSort(int *arr) {// Create new Arrayint *newArr = (int *)malloc(SIZE * sizeof(int));for (int i = 0; i < SIZE; i++) {int smallest = findSmallest(arr);newArr[i] = arr[smallest];// same as deleted by changing to the largest valuearr[smallest] = INT_MAX;}return newArr;
}int main(void) {int arr[SIZE] = {5, 3, 6, 2, 10};int *sortarr = selectionSort(arr);// print resultfor (int i = 0; i < SIZE; i++) {printf("%d ", sortarr[i]);}return 0;
}

每次找到数组中一个最小的值,同时有一个新数据空间来放每次找到的最小值,同时将原来数据的最小值设为最大值。

这样排序完成后,原来的数组将全为INT_MAX


C++11


#include <iostream>
#include <vector>using std::cout;
using std::endl;// Finds the smallest value in an array
template <typename T>
int find_smallest(const std::vector<T>& arr) {// stores smallest valueT smallest = arr[0];// stores index of the smallest valueint smallest_index = 0;for (int i = 0; i < arr.size(); i++) {if (arr[i] < smallest) {smallest = arr[i];smallest_index = i;}}return smallest_index;
}template <typename T>
std::vector<T> selection_sort(std::vector<T> arr) {std::vector<T> sorted;while(!arr.empty()) {// find smallest element and add it to sorted arrayint smallest_index = find_smallest(arr);sorted.push_back(arr[smallest_index]);// remove smallest element from non-sorted arrayarr.erase(arr.begin() + smallest_index);}return sorted;
}int main() {std::vector<float> arr = {1.2, 1.0, 3, 0, -1, 0.5, 100, -99};std::vector<float> sorted = selection_sort(arr);cout << "Sorted array: ";for (float num : sorted) {cout << num << " ";}cout << endl;
}

C#


using System;
using System.Collections.Generic;namespace ConsoleApplication
{public class Program{public static void Main(string[] args){var arr = new List<int> { 5, 3, 6, 2, 10 };Console.WriteLine(string.Join(", ", SelectionSort(arr)));}private static int[] SelectionSort(List<int> arr){var newArr = new int[arr.Count];for (int i = 0; i < newArr.Length; i++){var smallest = FindSmallest(arr);newArr[i] = arr[smallest];arr.RemoveAt(smallest);}return newArr;}private static int FindSmallest(List<int> arr){var smallest = arr[0];var smallestIndex = 0;for (int i = 0; i < arr.Count; i++){if (arr[i] < smallest){smallest = arr[i];smallestIndex = i;}}return smallestIndex;}}
}

Python


# Finds the smallest value in an array
def findSmallest(arr):# Stores the smallest valuesmallest = arr[0]# Stores the index of the smallest valuesmallest_index = 0for i in range(1, len(arr)):if arr[i] < smallest:smallest_index = ismallest = arr[i]      return smallest_index# Sort array
def selectionSort(arr):newArr = []for i in range(len(arr)):# Finds the smallest element in the array and adds it to the new arraysmallest = findSmallest(arr)newArr.append(arr.pop(smallest))return newArrprint(selectionSort([5, 3, 6, 2, 10]))

JAVA


import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;public class SelectionSort {private static List<Integer> selectionSort(List<Integer> arr) {List<Integer> newArr = new ArrayList<>(arr.size());int size = arr.size();for (int i = 0; i < size; i++) {int smallest = findSmallest(arr);newArr.add(arr.get(smallest));arr.remove(smallest);}return newArr;}private static int findSmallest(List<Integer> arr) {int smallest = arr.get(0);int smallestIndex = 0;for (int i = 0; i < arr.size(); i++) {if (arr.get(i) < smallest) {smallest = arr.get(i);smallestIndex = i;}}return smallestIndex;}public static void main(String[] args) {List<Integer> arr = new ArrayList<>(Arrays.asList(5, 3, 6, 2, 10));System.out.println(selectionSort(arr)); //[2, 3, 5, 6, 10]}
}
import java.util.Arrays;public class SelectionSort2 {// this version uses raw arrays instead of ArrayListprivate static int[] selectionSort(int[] arr) {int[] newArr = new int[arr.length];for (int i = 0; i < newArr.length; i++) {int smallestIndex = findSmallest(arr);newArr[i] = arr[smallestIndex];arr = getNewArrWithoutSmallest(arr, smallestIndex);}return newArr;}private static int[] getNewArrWithoutSmallest(int[] arr, int smallestIndex) {int[] newArrWithoutSmallest = new int[arr.length - 1];for (int i = 0; i < arr.length; i++) {if (i < smallestIndex) {newArrWithoutSmallest[i] = arr[i];} else if (i > smallestIndex) {newArrWithoutSmallest[i - 1] = arr[i];}}return newArrWithoutSmallest;}private static int findSmallest(int[] arr) {int smallest = arr[0];int smallestIndex = 0;for (int i = 0; i < arr.length; i++) {if (arr[i] < smallest) {smallest = arr[i];smallestIndex = i;}}return smallestIndex;}public static void main(String[] args) {int[] arr = {5, 3, 6, 2, 10};System.out.println(Arrays.toString(selectionSort(arr))); // [2, 3, 5, 6, 10]}
}

JS


'use strict';
// Selection Sort - O(n^2)
// Parameter:
//  1. random array// 1. Finds the smallest value in an array
function findSmallestIndex(array) {var smallestElement = array[0]; // Stores the smallest valuevar smallestIndex = 0; // Stores the index of the smallest valuefor (var i = 1; i < array.length; i++) {if (array[i] < smallestElement) {smallestElement = array[i];smallestIndex = i;}}return smallestIndex;
}// 2. Sort the array
function selectionSort(array) {var sortedArray = [];var length = array.length;for (var i = 0; i < length; i++) {// Finds the smallest element in the array var smallestIndex = findSmallestIndex(array);// Adds the smallest element to new arraysortedArray.push(array.splice(smallestIndex, 1)[0]);}return sortedArray;
}console.log(selectionSort([5, 3, 6, 2, 10])); // [2, 3, 5, 6, 10]
/*** Finds smallest element of an aray* @param {Array} arr array for searching* @return {number} index of the smallest element in array*/
const findSmallest = ( arr ) => {let smallest = arr[0];let smallestIndex = 0;let arrLen = arr.length;for ( let i = 0; i < arrLen; i++ ) {if ( arr[i] < smallest ) {smallest = arr[i];smallestIndex = i;}}return smallestIndex;
};/*** Sorts0 recursively an array of numbers* @param {Array} arr An array of numbers* @return {Array} New sorted array*/
const selectionSort = ( arr ) => {if ( !arr.length ) return [];let smallest = arr.splice( findSmallest( arr ), 1 );return smallest.concat( selectionSort( arr ) );
};let arr = [5, 3, 6, 2, 10];console.log( selectionSort(arr) );

《图解算法》学习笔记之选择排序相关推荐

  1. 输出dag的所有拓扑排序序列_算法学习笔记(53): 拓扑排序

    拓扑排序是对DAG(有向无环图)上的节点进行排序,使得对于每一条有向边 , 都在 之前出现.简单地说,是在不破坏节点 先后顺序的前提下,把DAG拉成一条链.如果以游戏中的科技树(虽然名字带树,其实常常 ...

  2. 图解算法学习笔记(二): 选择排序

    目录 1)数组和链表: 2)选择排序算法: 3)小结 本章内容: 两种基本数据结构:数组和链表: 选择排序算法: 1)数组和链表: 数组是连续的内存单元,链表可以不连续: 链表存储单元如图所示,每一个 ...

  3. 图解算法学习笔记(四):快速排序

    目录 1) 示例1: 2)快速排序 3) 再谈大O表示法 4)小结 本章内容:学习分而治之,快速排序 1) 示例1: 假设你是农场主,有一小块土地,你要将这块地均匀分成方块,且分出的方块尽可能大.如何 ...

  4. 图解算法学习笔记(一): 算法简介

    本章内容: 编写第一种查找算法--二分查找. 学习如何谈论算法的运行时间--大O表示法. 1) 算法是一组完成任务的指令,任何代码片段都可视为算法. 2)二分查找:一种查找算法,其输入是一个有序的元素 ...

  5. 02_Python算法+数据结构笔记-冒泡排序-选择排序-插入排序-快排-二叉树

    b站视频:路飞IT学城 清华计算机博士带你学习Python算法+数据结构_哔哩哔哩_bilibili 文章目录 #11 排序介绍 #12 冒泡排序介绍 #13 冒泡排序 #14 选择排序 #15 插入 ...

  6. 【算法学习】三 选择排序分析

    前言 社长,一个爱学习,爱分享的程序猿,始终相信,付出总会有回报的.知识改变命运,学习成就未来.爱拼才会赢! 程序猿学社的GitHub,已整理成相关技术专刊,欢迎Star:. https://gith ...

  7. 数据结构与算法读书笔记2----C# 选择排序

    C# 选择排序 代码  1 using System;  2 using System.Collections.Generic;  3 using System.Text;  4   5 namesp ...

  8. 图解算法学习笔记(九):动态规划

    目录 (1)背包问题 (2)最长公共子串 (3)小结 本章内容: 学习动态规划,它将问题分成小问题,并先着手解决这些小问题. 学习如何设计问题的动态规划解决方案. (1)背包问题 我们再看第八章的背包 ...

  9. 图解算法学习笔记(六):广度优先搜索

    目录 1)图简介 2)图是什么 3)广度优先搜索 4)实现图 5)实现算法 6)小结 本章内容; 学习使用新的数据结构图来建立网络模型: 学习广度优先搜索: 学习有向图和无向图: 学习拓扑排序,这种排 ...

  10. 图解算法学习笔记(八):贪婪算法

    目录 (1)背包问题 (2)集合覆盖问题 (3)NP完全问题 (4)小结 本章内容: 学习如何处理没有快速算法的问题(NP完全问题). 学习近似算法,使用它们找到NP问题的近似解. 学习贪婪策略. ( ...

最新文章

  1. 生成对抗网络在深度学习中占据非常重要的位置
  2. 4.QML动画——概念、动画应用方式和动画的缓动曲线
  3. 阿里DataV可视化大屏基本操作
  4. 一维卷积详细解释(转载+自己笔记)
  5. 西部数码域名解析到阿里云_西部数码云主机好吗 稳定性如何
  6. 2020教育OMO模式落地应用研究报告
  7. 为什么html运行之后不滚动,为什么很多移动端的HTML UI,在滚动时都用transform属性而不是用传统的滚动条?...
  8. loadrunner java_如何使用LoadRunner开发JAVA Vuser
  9. 一元线性回归多元线性回归
  10. android:视频录制编写代码一直报非法状态错误,很多时候定位在setVideoEncoder和setAudioEncoder...
  11. vs2010 如何更改界面
  12. 2021-09-07Hadoop运行模式:
  13. android 设置-关于手机-连续点击版本 打开开发者模式的功能实现
  14. angular写的移动端模板《一》
  15. 变种水仙花数 - Lily Number
  16. 7.20-7.26 字节推荐算法(DATA-EDU)5道面试题分享
  17. 新型Linux恶意软件隐藏在无效日期中、黑客通过微软漏洞监视目标电脑|11月26日全球网络安全热点
  18. 本地开发公众号获取code
  19. Java 证书 数字签名_JAVA 给PDF添加数字签名
  20. react学习笔记一:入门级小白到脚手架(create-react-app)开发项目

热门文章

  1. C# 滑块长度确认 Scrollbar滑块长度问题 水平垂直滚动条滑块高度宽度问题
  2. css img 适配尺寸_一次解决你的图像尺寸和定位问题
  3. 天津农学院计算机科学与技术在那个校区,天津农学院有几个校区及校区地址
  4. python 图形库介绍_数据分析Python手绘图形库有哪些
  5. linux编程创建文件,快速创建linux文件
  6. Java源码分析之CountDownLatch
  7. UIView animateWithDuration 使用详解
  8. js !!条件判断或运算的作用
  9. 动手才能进步(冒泡法示例)
  10. IIS安装时,安装程序无法复制一个或多个文件。特定错误码是0x4b8