插入排序

视觉感受 7 种常用的排序算法及代码实现

寵の児 提交于 2019-12-23 17:46:19
来自:todayx.org 链接:http://www.blogjava.net/todayx-org/archive/2012/01/08/368091.html   一步一步实现代码。 1 快速排序 介绍:   快速排序是由 东尼·霍尔 所发展的一种 排序算法 。在平均状况下,排序 n 个项目要 Ο ( n log n )次比较。在最坏状况下则需要 Ο ( n 2 )次比较,但这种状况并不常见。事实上,快速排序通常明显比其他 Ο ( n log n ) 算法更快,因为它的内部循环(inner loop)可以在大部分的架构上很有效率地被实现出来,且在大部分真实世界的数据,可以决定设计的选择,减少所需时间的二次方项之可能性。 步骤: 从数列中挑出一个元素,称为 "基准"(pivot), 重新排序数列,所有元素比基准值小的摆放在基准前面,所有元素比基准值大的摆在基准的后面(相同的数可以到任一边)。在这个分区退出之后,该基准就处于数列的中间位置。这个称为 分区(partition) 操作。 递归 地(recursive)把小于基准值元素的子数列和大于基准值元素的子数列排序。 排序效果: 算法思想:   基于分治的思想,是冒泡排序的改进型。首先在数组中选择一个基准点(该基准点的选取可能影响快速排序的效率,后面讲解选取的方法),然后分别从数组的两端扫描数组,设两个指示标志(lo指向起始位置

基于插入排序的算法实现(只是实现自己最初的想法)

梦想与她 提交于 2019-12-22 14:28:48
这次排序算法的设计思想是从一个数组的1索引开始,进行数组的遍历,并且一直确保正在遍历的索引值之前的数据是有序的,每次遍历一个数据时,将其放置到合适的位置上即可,但是该算法的判断条件过多,会显得比较麻烦,且每次从后往前找到合适的位置时,都要平均将数组的一半大小的数据进行移动,因此,这次代码的实现仅仅是个人想法的实现. 外层循环用 i 去遍历整个数组,内层循环用j从后往前判断array[j]与array[i]的大小关系 该算法的弊端需要判断三种不同的情况,处理结果也不完全相同,为了简化代码,合并其中注释的条件,设置flag进行条件判断 代码如下: import java.util.Arrays; public class InsertionSort { public static void insertSort(int[] array){ out: for (int i =1;i<array.length;i++){ int temp1 = array[i]; for(int j =i-1;j>=0;j--){ //在左侧找到比基准值小的数据,说明它的下一个数据就应该是array[i]的位置, //在该条件下,又应该判断是否进行值交换(即是否二者相邻,从而确定要不要进行将arra[j+1] = temp1) if((array[j]<temp1)) { boolean flag =

插入排序,适用于新手来理解的一篇博客!

纵然是瞬间 提交于 2019-12-21 23:47:51
1.1了解插入排序? 插入排序的代码实现虽然没有冒泡排序和选择排序那么简单粗暴,但是它的实现方式可谓是最容易理解的,就好像你在打扑克牌,往往都会用顺序放牌,是一种直观的排序方式,它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。 1.2插入排序的算法步骤 将第一个元素看做为有序序列,后将第二个到最后一个看成一个未排序序列,从头到尾依次扫描未排序序列进行比较,找到相应的位置并进行插入。 1.3插入动图演示 插入图片: 1.4代码实现部分 插入代码: package cn.cjrh; public class insertSort { public static void main(String[] args) { int [] arr = {82,7,8,12,65,94,76,1,46,3,64,78,45,11,28,39,78,45,63,96,47,85,14,52,25,36,63}; //设一个不规则的int数组进行比较 System.out.println(“排序前”); for (int i=0;i<arr.length;i++) { System.out.print(arr[i]+" “); } System.out.println(); for (int i = 1;i<arr.length;i++) /

排序算法以及其java实现

╄→尐↘猪︶ㄣ 提交于 2019-12-21 20:09:17
一、术语了解 稳定 :如果a原本在b前面,而a=b,排序之后a仍然在b的前面; 不稳定 :如果a原本在b的前面,而a=b,排序之后a可能会出现在b的后面; 内排序 :所有排序操作都在内存中完成; 外排序 :由于数据太大,因此把数据放在磁盘中,而排序通过磁盘和内存的数据传输才能进行; 时间复杂度: 一个算法执行所耗费的时间。 空间复杂度 :运行完一个程序所需内存的大小。 图片名词解释: n: 数据规模 k: “桶”的个数 In-place: 占用常数内存,不占用额外内存 Out-place: 占用额外内存 二、基础算法 1、冒泡算法 (1)思想:两两比较,每一趟都把最大或最小的数浮出 (2)优化:设置一个boolean isOrdered ;       在第一轮排序中一旦a[j] > a[j+1],就把isOrdered设为false,否则isOrdered设为true,然后我们在每趟排序前检查isOrdered,一旦发现它为false,即认为排序已完成。 (3)时间复杂度:要进行的比较次数为: (n-1) + (n-2) + ... + 1 = n*(n-1) / 2,因此冒泡排序的时间复杂度为O(n^2)。          最好的为O(n):数组已经有序,比较次数为n-1        public static void bubbleSort(int[] arr) {

排序算法

*爱你&永不变心* 提交于 2019-12-21 05:46:38
1.快速排序: 快速排序使用分治法(Divide and conquer)策略来把一个序列(list)分为两个子序列(sub-lists)。 步骤为: 从数列中挑出一个元素,称为"基准"(pivot), 重新排序数列,所有元素比基准值小的摆放在基准前面,所有元素比基准值大的摆在基准的后面(相同的数可以到任一边)。在这个分区结束之后,该基准就处于数列的中间位置。这个称为 分区(partition) 操作。 递归地(recursive)把小于基准值元素的子数列和大于基准值元素的子数列排序。 实现代码: def lessequal(value1,value2): return value1<=value2 def asc(ary,cmp=lessequal): if len(ary)<2: return ary else: pivot=ary[0] return asc([x for x in ary[1:] if cmp(x,pivot)],cmp)+[pivot]+asc([x for x in ary[1:] if not cmp(x,pivot)],cmp) def desc(ary,cmp=lessequal): if len(ary)<2: return ary else: pivot=ary[0] return desc([x for x in ary[1:] if not

python算法

南楼画角 提交于 2019-12-20 23:46:22
排序算法可以分为内部排序和外部排序,内部排序是数据记录在内存中进行排序,而外部排序是因排序的数据很大,一次不能容纳全部的排序记录,在排序过程中需要访问外存。常见的内部排序算法有:插入排序、希尔排序、选择排序、冒泡排序、归并排序、快速排序、堆排序、基数排序等。用一张图概括 关于时间复杂度: 平方阶 (O(n2)) 排序 各类简单排序:直接插入、直接选择和冒泡排序。 线性对数阶 (O(nlog2n)) 排序 快速排序、堆排序和归并排序。 O(n1+§)) 排序,§ 是介于 0 和 1 之间的常数。 希尔排序。 线性阶 (O(n)) 排序 基数排序,此外还有桶、箱排序。 关于稳定性: 稳定的排序算法:冒泡排序、插入排序、归并排序和基数排序。 不是稳定的排序算法:选择排序、快速排序、希尔排序、堆排序。 名词解释: n:数据规模 k:“桶”的个数 In-place:占用常数内存,不占用额外内存 Out-place:占用额外内存 稳定性:排序后 2 个相等键值的顺序和排序之前它们的顺序相同 冒泡排序 冒泡排序(Bubble Sort)也是一种简单直观的排序算法。它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。这个算法的名字由来是因为越小的元素会经由交换慢慢“浮”到数列的顶端。

20162326 2017-2018-1 《程序设计与数据结构》第3周学习总结

时光怂恿深爱的人放手 提交于 2019-12-19 11:41:34
20162326 齐力锋 2017-2018-1 《程序设计与数据结构》第3周学习总结 教材学习内容总结 排序的分类 : 按排序过程中的操作分类 插入排序 交换排序 选择排序 归并排序 选择排序 按排序算法的时间复杂度分类 简单的排序算法o ( n^2) 先进的排序算法 基数排序 查找即在一组项内找到指定目标或是确定目标不存在的过程。 查找的分类 线性查找 二分查找 二分查找的特点为查找池有序 二分查找适合大的查找池,更有效一点 选择排序、插入排序及冒泡排序的平均时间复杂度都是O(n^2)。 快速排序的关键是选一个正确的枢轴 归并排序的最坏运行时间复杂度是O n x logn. 各项排序的方法和我的理解 希尔排序:把一个长序列分隔成K个短序列,但是这个K要找好不然会很麻烦,他是对直接插入排序的改进 插入排序:比较然后插入排序 交换排序: 冒泡排序:有点类似身高从高到低排序 ,扫描一次确定一个元素的位置, 快速排序:效率较高,选择一个枢轴,最终使得左边都比枢轴小,右边都大。枢轴移动是比较 归并排序:把整个表分成多个表,分别排好序后再合并 选择排序:需要扫描整个表,有时候效率不高 代码托管 算法的效率 本周结对学习情况 20162326刘诚昊同学 其他(感悟、思考等,可选) 本周主要学习了查找和排序,我认为明白这些方法只是入门,能自己写出来代码才是水平。理解和动手之间差了很多层次

插入排序

不羁岁月 提交于 2019-12-18 22:01:40
C++实现插入排序 # include <iostream> using namespace std ; void charu ( int arry [ ] , int n ) ; int main ( ) { int a [ ] = { 12 , 3 , 34 , 53 , 32 , 83 , 93 , 53 , 64 , 26 , 63 , 75 , 35 } ; int len ; len = sizeof ( a ) / sizeof ( int ) ; cout << "原始数列:" << endl ; for ( int i = 0 ; i < len ; i ++ ) cout << a [ i ] << " " ; cout << endl ; charu ( a , len ) ; system ( "pause" ) ; } void charu ( int a [ ] , int len ) { int insert , index ; for ( int i = 1 ; i < len ; i ++ ) { insert = a [ i ] ; index = i - 1 ; while ( index >= 0 && insert < a [ index ] ) { a [ index + 1 ] = a [ index ] ; index -- ; }

链表的插入排序

ぃ、小莉子 提交于 2019-12-18 02:38:17
/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode(int x) : val(x), next(NULL) {} * }; */ class Solution { public: ListNode *insertionSortList(ListNode *head) {   if(head==NULL || head->next==NULL) return head;   ListNode *phead1=new ListNode(head->val);//重新建立一个链表   ListNode *phead2=phead1;//临时节点   ListNode *p=head->next;   while(p)   {   if(p->val<phead1->val)//当当前节点的值小于头节点时,插入链表头部   {    phead2=p->next;//保存当前节点的后一个节点    p->next=phead1;    phead1=p;    p=phead2;//后移   }else   {   ListNode *tmp=phead1;//保存头节点   while(phead1->next!=NULL &&