Aglorithms 算法学习笔记20180411

2018.4.12更新:

//增加8种Sorting算法的过程和动图展示。

如同昨天笔记中记录的,刷题的过程中,我渐渐意识到,学习编程的一个重点是算法,于是在某乎上寻找参考教材,有许多人推荐了这本入门书目,是由Robert Sedgewick和Kevin Wayne编写的Algorithms,第4版,他们还为此制作了一个网站,网站链接也一并放上来吧。

网站上放了许多与书本内容相关的习题,补充阅读资料等。因为时间紧迫,我动用某电子书下载网站获取了这本书的PDF档,并且在Coursera公开课网站上找到了配套的视频教程,由作者亲自讲解。Cousera的课程链接也放上来好了。

, :
Algorithms 4th Edition, :


Algorithms Part I on Coursera

在了解了这个公开课的大纲后,我准备先学习视频,然后对照书本去了解每一种算法的具体实现,有一点好的是,这本书给出的代码是用Java实现的,而我也正好要学习Java。

今天的主要笔记是排序问题的算法,排序问题其实从大学学习计算机基础的时候,就讲过一种,叫冒泡法排序,但是这种方法的复杂度较大,因为它要针对数组的每一个元素进行逐个比较。我前一篇笔记给出的网站上提供了一共8种排序算法的动图演示。借助这个动图,我们可以清楚地了解各算法的差异。

Bubble Sort

第一种是冒泡法排序,它的算法过程如下:

do swapped = false

for i = 1 to indexOfLastUnsortedElement-1

    if leftElement > rightElement

        swap(leftElement, rightElement)

        swapped = true

while swapped

它的方法是使用for循环,将序列的元素两两比较,如果左边元素小于右边,则保持顺序不变,否则交换两个元素位置,让小的放左边。如GIF动图所显示的,第一轮交换后,还要继续N轮交换,每次交换都会把较小的往前挪,这个算法很费明。

Selection Sort

第二种是选择法排序,它的算法过程如下:

repeat (numOfElements - 1) times

    set the first unsorted element as the minimum

   for each of the unsorted elements

       if element < currentMinimum

          set element as new minimum

swap  minimum with first unsorted position

先假定第一个元素是最小的,然后使用for循环遍历其他元素,与"最小值"进行比较,如果找到比最小值小的元素,则交接两元素位置。这时我们已经能确认找到了真的最小值,最左边的元素不用再动了。此时需要排序的元素数量为N-1.这

接下来对N-1长度的序列再重复此过程,直至所有元素按顺序排列完成。


Insertion Sort

第三种是插入排序,它的算法过程如下:

mark first element as sorted

for each unsorted element X

'extract' the element X

for j = lastSortedIndex down to 0

     if current element j > X

         move sorted element to the right by 1

break loop and insert X here

方法是默认第一个元素已经排序完成,从最后一个元素开始,假定名叫arr[j],与前面的元素逐一比较,如果arr[j]比前面的元素小,则继续往前找,如果比该元素大,则在该位置插入arr[j],重复下去即可。这样让序列的小数值逐步挪到前面,大数值挪到后面,最终完成排序。

Merge Sort

第四种是合并排序,它的算法过程如下:

split each element into partitions of size 1

recursively merge adjancent partitions

for i = leftPartStartIndex to rightPartLastIndex inclusive

    if leftPartHeadValue <= rightPartHeadValue

        copy leftPartHeadValue

   else: copy rightPartHeadValue

copy elements back to original array

方法是先将序列拆分为子序列,然后每个子序列先从小到大排序,比如分为三部分,排序完成后再逐一比较每个子序列,每个序列的1号元素和1号元素比,2号元素和2号元素比,确定最后的先后顺序,最后只剩下两个子序列,再比较一次就可以完成排序。

Quick Sort

第五种是Quick Sort,它的算法过程如下:

for each (unsorted) partition

set first element as pivot

storeIndex = pivotIndex + 1

    for i = pivotIndex + 1 to rightmostIndex

    if element[i] < element[pivot]

       swap(i, storeIndex);

storeIndex++ swap(pivot, storeIndex - 1)

默认第一个元素不动,从第二个元素开始,与后面的其他元素比较,如果大于其他元素,则两者位置互换,这样渐渐把小的放在前面,大的放在后面。

Random Quick Sort

第六种是Random Quick Sort,它的算法过程如下:

for each (unsorted) partition

randomly select pivot, swap with first element

storeIndex = pivotIndex + 1

for i = pivotIndex + 1 to rightmostIndex

     if element[i] < element[pivot]

      swap(i, storeIndex);

          storeIndex++

swap(pivot, storeIndex - 1)

与Qucik Sort相比,它只是随机选择了一个数作为第一个元素,其他一样。


Couting Sort

第七种是Counting Sort,它的算法过程如下:

create key (counting) array

for each element in list

     increase the respective counter by 1

for each counter, starting from smallest key

     while counter is non-zero restore element to list

       decrease counter by 1

方法是创建一个计数数组,用于统计每个相同大小的元素个数,在对所有数计数完成后,按从小到大的顺序取数,每取一个数,相应的计数减1。这种适用于有许多重复元素的序列。

Radix Sort

第八种是Randix Sort,它的算法过程如下:

Create 10 buckets (queues) for each digit (0 to 9)

for each digit placing

     for each element in list

       move element into respective bucket

     for each bucket, starting from smallest digit

     while bucket is non-empty

restore element to list

方法是先创建标记0-9的十个桶,用于装数字,然后按照低位排序,先排个位数,将所有个位数为0的放在一个桶中,个位数为1的放在一个桶中。然后是十位数排序,直到最大的数所在的位数。具体每步的排序结果如下:

step 1


step 2

最后按0-9的序列把每个桶里的元素提取出来放回原序列即可。看懂了吗?

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 157,298评论 4 360
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 66,701评论 1 290
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 107,078评论 0 237
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,687评论 0 202
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,018评论 3 286
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,410评论 1 211
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,729评论 2 310
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,412评论 0 194
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,124评论 1 239
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,379评论 2 242
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 31,903评论 1 257
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,268评论 2 251
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,894评论 3 233
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,014评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,770评论 0 192
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,435评论 2 269
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,312评论 2 260

推荐阅读更多精彩内容

  • 排序算法说明 (1)排序的定义:对一序列对象根据某个关键字进行排序; 输入:n个数:a1,a2,a3,…,an 输...
    code武阅读 629评论 0 0
  • 参考:十大经典排序算法 0、排序算法说明 0.1排序的定义 对一序列对象根据某个关键字进行排序。 0.2 术语说明...
    谁在烽烟彼岸阅读 965评论 0 12
  • Ba la la la ~ 读者朋友们,你们好啊,又到了冷锋时间,话不多说,发车! 1.冒泡排序(Bub...
    王饱饱阅读 1,763评论 0 7
  • 冥鬼亡魂者 执灯引众鬼路 伥鬼夜啼儿 行两侧 队不变 今朝十殿阎罗 临与百鬼众行夜 长安无人也 判官控笔与科举者...
    吓死地球人阅读 276评论 0 0
  • 因为本人的工作需要,偶尔被要求实现一些市面上已经有的成熟接口功能。这里要转折一下,不是说我实现的功能的稳定性和成熟...
    代码使我快乐阅读 810评论 0 0