关于数据结构中冒泡排序和选择排序的总结
2016-07-08 18:40
232 查看
今天在看数据结构的时候,刚好看到数据结构中的冒泡排序和选择排序。
现在就把关于冒泡排序和选择排序进行总结,免得自己以后忘记。
冒泡排序:它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。
冒泡排序可以从最后一个元素开始,以此比较两个相邻的值,谁的值小,就在前面,当一趟比较晚的时候,数组中最小的数字就在第一个元素的位置上,以此进行循环,可以总结如下:
比较相邻的元素。如果第一个比第二个大,就交换他们两个。
对每一对相邻元素作同样的工作,从最后一对到开始的第一对。在这一点,开始的元素应该会是最小的数。
针对所有的元素重复以上的步骤,除了最后一个。
持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。
选择排序:每一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,直到全部待排序的数据元素排完。
选择排序是不稳定的排序方法(比如序列[5, 5, 3]第一次就将第一个[5]与[3]交换,导致第一个5挪动到第二个5后面)。
我们先假设数组的第一个元素是最小的,定义一个值K记录第一个的下标,然后开始循环,从第二个数开始循环,当第二个数比第一个数小的时候,K指向第二个数,以此类推,循环一趟下来,K指向的数比第一个数小,这时候进行数值的交换。以此进行循环,
可以总结为:
对比数组中前一个元素跟后一个元素的大小,如果后面的元素比前面的元素小则用一个变量k来记住他的位置,接着第二次比较,前面“后一个元素”现变成了“前一个元素”,继续跟他的“后一个元素”进行比较如果后面的元素比他要小则用变量k记住它在数组中的位置(下标),等到循环结束的时候,我们应该找到了最小的那个数的下标了,然后进行判断,如果这个元素的下标不是第一个元素的下标,就让第一个元素跟他交换一下值,这样就找到整个数组中最小的数了。然后找到数组中第二小的数,让他跟数组中第二个元素交换一下值,以此类推。
从上面的代码中就可以看出来选择排序的效率比冒泡排序的效率高
现在就把关于冒泡排序和选择排序进行总结,免得自己以后忘记。
冒泡排序:它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。
冒泡排序可以从最后一个元素开始,以此比较两个相邻的值,谁的值小,就在前面,当一趟比较晚的时候,数组中最小的数字就在第一个元素的位置上,以此进行循环,可以总结如下:
比较相邻的元素。如果第一个比第二个大,就交换他们两个。
对每一对相邻元素作同样的工作,从最后一对到开始的第一对。在这一点,开始的元素应该会是最小的数。
针对所有的元素重复以上的步骤,除了最后一个。
持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。
public static 4000 void sort(long[] arr){ long tem = 0; //这是第几趟 for(int i = 0;i<arr.length - 1;i++){ for(int j = arr.length- 1;j > i;j--){ if(arr[j]<arr[j-1]){ tem = arr[j]; arr[j] = arr[j-1]; arr[j-1] = tem; } } } }
选择排序:每一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,直到全部待排序的数据元素排完。
选择排序是不稳定的排序方法(比如序列[5, 5, 3]第一次就将第一个[5]与[3]交换,导致第一个5挪动到第二个5后面)。
我们先假设数组的第一个元素是最小的,定义一个值K记录第一个的下标,然后开始循环,从第二个数开始循环,当第二个数比第一个数小的时候,K指向第二个数,以此类推,循环一趟下来,K指向的数比第一个数小,这时候进行数值的交换。以此进行循环,
可以总结为:
对比数组中前一个元素跟后一个元素的大小,如果后面的元素比前面的元素小则用一个变量k来记住他的位置,接着第二次比较,前面“后一个元素”现变成了“前一个元素”,继续跟他的“后一个元素”进行比较如果后面的元素比他要小则用变量k记住它在数组中的位置(下标),等到循环结束的时候,我们应该找到了最小的那个数的下标了,然后进行判断,如果这个元素的下标不是第一个元素的下标,就让第一个元素跟他交换一下值,这样就找到整个数组中最小的数了。然后找到数组中第二小的数,让他跟数组中第二个元素交换一下值,以此类推。
public static void sort(long[] arr){ int k = 0; long tem; for(int i = 0;i<arr.length -1;i++){ for(int j = i;j<arr.length;j++){ if(arr[j] < arr[k]){ k = j; } } tem = arr[i]; arr[i] = arr[k]; arr[k] = tem; } }
从上面的代码中就可以看出来选择排序的效率比冒泡排序的效率高
相关文章推荐
- 数据结构
- 复习(数据结构):线性表 : c++_标准写法
- Hash表
- 零起点学C++ 第四章 C++数据结构
- poj2479
- 二叉树基础及应用
- poj 2481 cows 树状数组
- 数据结构复习练手之nyoj5
- 数据结构与算法简记:通过前序中序或中序后序构建二叉树
- 数据结构-AVL树
- 二叉树基础-由中根序列和后根序列重建二叉树(数据结构基础 第5周)
- 树的定义和基本概念
- 反转单链表
- 关于数据结构之树的一些总结
- 浅析Python heapq模块 堆数据结构
- Java数据结构与算法学习记录(1)
- 单链表(带或不带头结点)的建立、反转和部分反转
- 【数据结构】二叉搜索树
- 二叉树基础-二叉树类模板的实现(数据结构基础 第5周)
- 算法导论 第三部分——基本数据结构——栈、队列、链表、散列表