`
lighter
  • 浏览: 500944 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

重新温习数据结构二:简单排序

阅读更多

这里并没有给出完整的例子,只是一些代码块.我说的是最核心的一些部分.
1、冒泡排序,这应该是性能最差的一种排序,不提倡用.

  1. public void bubbleSort()   
  2.   {   
  3.   int out, in;   
  4.   for(out=nElems-1; out>1; out--)   // 外层的循环,nElems是数组的大小   
  5.      for(in=0; in<out; in++)        // 里面层的循环   
  6.         if( a[in] > a[in+1] )          
  7.            swap(in, in+1);          // 交换两个数   
  8.   }     

交换的方法:

  1. private void swap(int one, int two)   
  2. {   
  3. long temp = a[one];   
  4. a[one] = a[two];   
  5. a[two] = temp;   
  6. }  


小结:冒泡排序的交换和比较操作的次数都和N2成正比,排序需要O(N2)的时间级别.

2、选择排序的算法:

 

  1. public void selectionSort()   
  2.     {   
  3.     int out, in, min;   
  4.   
  5.     for(out=0; out<nElems-1; out++)   // 外层的循环,nElems是数组的大小   
  6.        {   
  7.        min = out;                     //最小值设为min   
  8.        for(in=out+1; in<nElems; in++) // 里面层的循环   
  9.           if(a[in] < a[min] )         // 如果有更小的值   
  10.               min = in;                   
  11.        swap(out, min);                // 交换   
  12.        }      
  13.     }   

小结:选择排序与冒泡排序执行了相同次数的比较N*(N-1)/2。当N值比较大时,比较的次数是主要,这时候采用选择排序性能也不好;当N值比较小的时候,选择排序的性能还是比较好的.

3、插入排序:性能比冒泡排序,选择排序好,在局部有序的情况下,插入排序的性能很好.

 

  1. public void insertionSort()   
  2.       {   
  3.       int in, out;   
  4.   
  5.       for(out=1; out<nElems; out++)         
  6.          {   
  7.          long temp = a[out];            // 标记一下   
  8.          in = out;                             
  9.          while(in>0 && a[in-1] >= temp) // 直到有一个值比temp小的   
  10.             {   
  11.             a[in] = a[in-1];            // 移动出一个空位   
  12.             --in;                              
  13.             }   
  14.          a[in] = temp;                  // 插入这一个值temp   
  15.          }     
  16.       }     
  17.   

小结:如果数组是基本有序或是有序了,这时候用插入排序只需要O(N)的时间。但如果对于逆序的数据,性能并不比冒泡排序快,这一点需要注意.

下一次会介绍多几种排序的,有空且心情好的时候再过来写写。

分享到:
评论

相关推荐

    数据结构 一元多项式运算 C++实现

    数据结构一元多项式运算 C++实现 一、设计简要说明 本程序“一元多项式运算”是以实现...通过一个学期对数据结构的学习,使我对其有了很大的了解,也对 C++进行了温习和了解;这个学期的寒假期间,我们每个人都做了。

    基于c语言成绩管理系统课程设计样本.doc

    学生在课程设计过程中,通过重新温习C语言和应用数据结构知识,提高了编程技能,学会了独立思考和解决问题。同时,也体验到了团队合作的重要性,增强了动手操作和问题解决的能力。在反思中,学生表示虽然遇到困难,...

    SQL 大全(有两个版本) 经典汇聚,适合大家温习,从易到难分阶段进行讲解

    1. 数据查询:包括SELECT语句的基本用法,如选择特定列、使用WHERE子句过滤数据、GROUP BY进行数据分组、HAVING对分组后的数据进行过滤,以及使用ORDER BY进行排序等。 2. 数据插入:INSERT语句用于向表中插入新...

    软件设计师学习计划(谁都适用,很实用)

    数据结构是软件设计师考试的基础知识之一,需要掌握相关的排序算法,可以通过网上的一些排序算法动态图示的帖子进行高效学习。上午的考查部分占比5分左右。 第六周:算法设计 在第六周,需要学习《软件设计官方...

    算法参考资料2015CCPCNanyangOnsiteWarmup

    - 数据结构和算法的优化:对时间和空间复杂度的优化,如何根据特定问题选择合适的算法和数据结构。 - 竞赛中典型问题的分析和解决:可能包括图论问题、数论问题、字符串处理等。 - 算法竞赛的规则和技巧:竞赛环境下...

    2007年上半年 程序员 上午试卷 及 答案

    3. **算法**:包括排序算法(如冒泡、选择、插入、快速、归并等)、查找算法(如顺序查找、二分查找等)以及递归和回溯等。 4. **操作系统原理**:进程与线程的概念,内存管理,I/O模型,以及操作系统提供的系统调用...

    零基础学算法(二)-源代码

    零基础学习算法,共分为两部分——...及想要温习算法的老朋友们,内容包含了简单、 复杂数据结构、排序、 查找、 算法问题和数学问题以及经典算法问题等。另外还有信息学奥赛试题精解也很不错的!希望大家分享学习!

    leetcode题库-LeetCode:LeetCode题库刷题代码

    2. **算法**:包括排序算法(快速排序、归并排序、冒泡排序等)、搜索算法(二分查找、深度优先搜索、广度优先搜索等)、动态规划、贪心算法、回溯法等。理解和熟练运用这些算法能提高解决复杂问题的能力。 3. **...

    软件开发实习日记.doc

    今天的任务是实现一个简单的排序算法,包括界面、数据压入堆栈、简单冒泡排序和堆排序输出。通过这个任务,实习生快速地熟悉了 C# 语言,并加深了对冒泡排序和堆排序的理解。 Daily Work 2中,实习生继续改进昨天的...

    leetcode答案-leetcode-java:leetcode-java

    2. 数组与集合:理解数组和集合的区别,熟练运用ArrayList、LinkedList、HashMap等数据结构。 3. 控制流:掌握if-else、switch、for、while等语句的使用,以及三元运算符的应用。 4. 函数与方法:理解函数的参数传递...

    零基础学算法-ppt讲义

    零基础学习算法,共分为两部分——...及想要温习算法的老朋友们,内容包含了简单、 复杂数据结构、排序、 查找、 算法问题和数学问题以及经典算法问题等。另外还有信息学奥赛试题精解也很不错的!希望大家分享学习!

    SQL必知必会(第四版)

    从简单的选择特定列、行到复杂的联接操作,再到聚合函数(如COUNT、SUM、AVG、MAX、MIN)的应用,读者将掌握如何从数据中提取所需信息。此外,还会讲解子查询,这是一种嵌套在其他查询中的查询,用于获取更复杂的...

    零起点学通C++多媒体范例教学代码

    14.7.3 函数传参实例三——用二分算法查找数据 14.7.4 函数传参实例四——判断数组是否按照顺序排列 14.7.5 函数传参实例五——判断数组排列方式后执行不同的函数 14.8 数组在对象中的传参 14.9 对象数组 14.10 在...

    零起点学通C++学习_多媒体范例教学代码

    14.7.3 函数传参实例三——用二分算法查找数据 14.7.4 函数传参实例四——判断数组是否按照顺序排列 14.7.5 函数传参实例五——判断数组排列方式后执行不同的函数 14.8 数组在对象中的传参 14.9 对象数组 14.10...

Global site tag (gtag.js) - Google Analytics