躲不掉的“排序算法”

排序算法,以前米老师讲VB的时候就讲过排序,随机显示10个数,并显示最大的数。利用冒泡、希尔等等排序算法都讲过,这次数据机构导论再次遇到,软考再次遇到,应该算是比较容易的一项吧。

学习完数据结构导论,又进一步了解到了排序算法。我们都知道,排序是数据处理的一种运算,因为数据处理花费的时间很多,人么为了提高计算机的运行效率而提出了各种各样的排序算法。

用米老师的话说就是“两两比较交换”。

比较两个关键字的大小,将记录从一个位置移动到另一个位置。

排序的稳定性:

判断稳定性,通过相同键值的两个记录在排序前后相对位置变化情况进行判断。

例如:已知一组数据:1、3、2、5、6、2

通过排序得到1、2、2、3、5、6   
排序前带下划线的2在不带下划线的2后面,排完序仍然在它后面就是稳定的,否则就是不稳定的。

1、插入排序

 直接插入排序:依次将每个记录插入到一个已排好序的有序表中,得到一个新的、记录仪数增加1的有序表。

个人理解:通过和与前面排好的有序表数据进行比较,然后放到合适的位置去,直至排完。直接插入排序是相对于记录数较少的一种排序。

2、交换排序(两两比较,如果两个键值的大小出现逆序,则交换。)

冒泡排序:将第一个记录的键值和第二个记录的键值进行比较,若为逆序,则交换;然后继续比较第二个和第三个,第n-1个和第n个。

个人理解:后一个数与前一个数进行比较,看是否需要交换。

快速排序:n个记录中取一个记录的键值为标准,通过一趟排序将待排序的记录分为小于、等于、大于这个键值的独立部分,再继续进行快速排序。

第一趟排序比较难(对外于我来说),这个会了后面也就简单了。一趟排序的步骤:将两个指针i,j分别指向初始位置和最后的位置,然后反复操作一下两步:

(1)、j逐渐减小,并逐次比较j指向的元素和目标元素的大小,若p(j)<T则交换位置。

(2)、i逐渐增大,并逐次比较I指向的元素和目标元素的大小,若p(i)>T则交换位置。

3、选择排序

直接选择排序:在i此选择操作中,通过n-i次的键值比较,从n-i+1中选出键值最小的记录,和第i(1<=i<=n-1)个记录交换。

个人理解:找出最小的那个数与前面的数进行交换,前面排好的就不能动了。

堆排序:

首先要知道堆排序是一种树形选择排序.将一个初始序列建成一个堆就是一个反复筛选的过程.

个人理解:自上而下进行调整,重建堆的过程。

4、归并排序

将两个或两个以上的有序表合并成一个新的有序表。

        二路归并排序

是将两个有序表合并成一个有序表的排序方法。

个人理解:1、每相邻的两个记录合并,两两比较、排序

2、再两个合并再比较进行排序。

总结:一句话“两两比较交换!”

以上学习方法是非常不好的,虽然是理解了每一种排序,但是没有进行比较,没有编制知识网,每种排序都有可能有相似之处,也有差别之处,用的过程可能会混淆。

学习方法: 结合以前老师讲过的,把它当做旧知识来重温,简单化,其实就是旧知识。

遇到的问题:

因为自己没有去相互比较每种排序,而每种排序又有一些相似之处,所有会混淆。

插入排序VS冒泡排序:插入排序是从第二个键值开始,与前面的数进行比较,放到合适的位置;

冒泡排序是1和2的键值比较,2和3的键值比较。。。。。。n和n-1的键值比较,出现逆序则交换。

冒泡排序VS直接选择排序:

冒泡排序是一个又三角,直接选择排序是一个左三角。

冒泡排序整个排序过程至多进行n-1趟起泡,直接选择排序进行n-1次比较,每趟找出最小(最大)的那个键值与前面的进行交换。

这样自己容易混的就不会记混了。个人理解可能存在问题,望大家指出,谢谢。

时间: 2024-12-20 11:53:45

躲不掉的“排序算法”的相关文章

八种排序算法

最近一段时间自己在研究各种排序算法,于是自己写了一个八种排序算法的集合: /************************************************************************* > Copyright (c)2014 stay hungry,stay foolish !!! > File Name: sort.cpp > Author: kanty > Mail: [email protected] > Created Time:

java几种常见的排序算法总结

[java] view plain copy /*************几种常见的排序算法总结***************************/ package paixu; public class PaiXu { final int MAX=20; int num[]=new int[MAX]; { System.out.print("生成的随机数组是:"); for(int i=0;i<20;i++){ num[i]=(int)(Math.random()*100)

各种排序算法比较

各种常用排序算法 类别 排序方法 时间复杂度 空间复杂度 稳定性 复杂性 特点 最好 平均 最坏 辅助存储 简单 插入 排序 直接插入 Insert O(N) O(N2) O(N2) O(1) 稳定 简单 希尔排序 Shell O(N) O(N1.3) O(N2) O(1) 不稳定 复杂 选择 排序 直接选择 Select O(N) O(N2) O(N2) O(1) 不稳定 按理说平均复杂度和最坏复杂度相同是稳定排序.但是:序列5 8 5 2 9,第一遍选择第1个元素5会和2交换,那么原序列中2

排序算法----基数排序(RadixSort(L))单链表智能版本

转载http://blog.csdn.net/Shayabean_/article/details/44885917博客 先说说基数排序的思想: 基数排序是非比较型的排序算法,其原理是将整数按位数切割成不同的数字,然后按每个位数分别比较. 将所有待比较数值(正整数)统一为同样的数位长度,数位较短的数前面补零.然后,从最低位开始,依次进行一次排序.在每一次排序中,按照当前位把数组元素放到对应 的桶当中,然后把桶0到桶9中的元素按先进先出的方式放回数组中.这样从最低位排序一直到最高位排序完成以后,

排序算法----基数排序(RadixSort(L,max))单链表版本

转载http://blog.csdn.net/Shayabean_/article/details/44885917博客 先说说基数排序的思想: 基数排序是非比较型的排序算法,其原理是将整数按位数切割成不同的数字,然后按每个位数分别比较. 将所有待比较数值(正整数)统一为同样的数位长度,数位较短的数前面补零.然后,从最低位开始,依次进行一次排序.在每一次排序中,按照当前位把数组元素放到对应 的桶当中,然后把桶0到桶9中的元素按先进先出的方式放回数组中.这样从最低位排序一直到最高位排序完成以后,

【Unity3D自学记录】可视化对照十多种排序算法(C#版)

在这篇文章中.我会向大家展示一些排序算法的可视化过程.我还写了一个工具.大家可对照查看某两种排序算法. 下载源代码 – 75.7 KB 下载演示样例 – 27.1 KB 引言 首先,我觉得是最重要的是要理解什么是"排序算法".依据维基百科.排序算法(Sorting algorithm)是一种能将一串数据按照特定排序方式进行排列的一种算法. 最经常使用到的排序方式是数值顺序以及字典顺序.有效的排序算法在一些算法(比如搜索算法与合并算法)中是重要的,如此这些算法才干得到正确解答.排序算法也

六大经典排序算法

插入排序法 插入排序法的思想是从前往后,先排序前两个元素,把第三个元素插入其中,然后让前三个已经排好序,再把第四个插入前三个中,排好序...以此类推,直到最后一个插入为止,这样便完成了插入排序.该算法的复杂度为n^2. public class InsertSort { public static void main(String[] args) { //数组声明 int[] a = {5,1,3,0,1,4,-1}; int L = a.length; //首先确保前两个元素是升序的 if(a

各种排序算法代码汇总

计算机随机生成10000个数,让算法排序.花费时间如下: 代码: // KindsOfSort.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include <iostream> #include <cstdlib> #include <ctime> using namespace std; #define N 10000 //插入排序 稳定的排序算法 时间复杂度O(n^2) void insert_sor

排序算法之计数排序

mnesia在频繁操作数据的过程可能会报错:** WARNING ** Mnesia is overloaded: {dump_log, write_threshold},可以看出,mnesia应该是过载了.这个警告在mnesia dump操作会发生这个问题,表类型为disc_only_copies .disc_copies都可能会发生. 如何重现这个问题,例子的场景是多个进程同时在不断地mnesia:dirty_write/2 mnesia过载分析 1.抛出警告是在mnesia 增加dump