我的读书笔记(排序算法)

1.快速排序

  • 假设待排序的序列为L[m...n],而一趟排序目的就是将其分割为两个子序列,分别为L[m...middle-1]和L[middle+1...n],其中L[m...middle-1]中的每个元素都小于L[middle],而L[middle+1...n]中的每个元素都大于L[middle]
  • 递归调用快速排序算法,对L[m...middle-1]和L[middle+1..n]分别进行排序
  • 由于是原地排序,所以递归结束后就自然形成了有序序列
 1      /// <summary>
 2         /// 快速排序算法
 3         /// </summary>
 4         /// <param name="data">排序数组</param>
 5         /// <param name="low">排序下限</param>
 6         /// <param name="high">排序上限</param>
 7         static void Run(int[] data,int low, int high)
 8         {
 9             //简单设定中间值,并以此为一趟排序的分割点
10             //注意这里是一个简单的算法
11             //如果想对这个算法进行优化的话,可以采取随机的方法来获取分割点
12             int middle = data[(low+high)/2];
13             int i = low;
14             int j = high;
15             do
16             {
17                 //扫描middle值左边的元素
18                 while (data[i] < middle && i < high)
19                     i++;
20                 //扫描middle值右边的元素
21                 while (data[j] > middle && j > low)
22                     j--;
23                 //找到了一个可以交换的值
24                 if (i <= j)
25                 {
26                     //交换
27                     int temp = data[i];
28                     data[i] = data[j];
29                     data[j] = temp;
30                     i++;
31                     j--;
32                 }
33
34             } while (i <= j);
35             //递归对比分割点元素都小的那个序列进行快速排序
36             if (j > low)
37                 Run(data,low,j);
38             //递归对比分割点元素都大的那个序列进行快速排序
39             if(i<high)
40                 Run(data,i,high);
41         }

  快速排序在最坏的情况下运行时间为0(n*n)平均运行时间为O(nlgn),快速排序的排序对象都读入内存中,所以输入内部排序,快速排序基于比较关键字来确定元素的位置,所以它属于比较排序,同时,快速排序具有原地排序特性和不稳定特性,这意味着快速排序不需要额外的排序空间,但是不能确保相等元素位置不被交换。
2.二分法查找算法
  • 在一个有序序列L[m...n]查找元素k,先比较L[(m+n)/2]的值和元素K,如果相等则返回(m+n)/2
  • 如果L[(m+n)/2]的值比K小,则在L[(m+n)/2+1...n]中使用二分法查找K
  • 如果L[(m+n)/2]的值比K大,则在L[m...(m+n)/2-1]中使用二分法查找K
 1 static int Search(int[] data ,int val)
 2         {
 3             //如果数组为空,则直接返回-1
 4             if (data.Length <= 0) return -1;
 5             //设置初始化上下限为数组的上下限
 6             int low = 0;
 7             int high = data.Length - 1;
 8             //循环二分法查找,直至找到或者查找完毕
 9             while(low<=high)
10             {
11                 //找到制定元素
12                 int middle = (low + high) / 2;
13                 if (data[middle] == val)
14                     return middle;
15                 //对二分后较大的那一半序列进行查找
16                 else if (data[middle] < val)
17                     low = middle + 1;
18                 //对二分后较小的那一半序列进行查找
19                 else
20                     high = middle - 1;
21             }
22             //二分结束仍没找到指定元素
23             return -1;
24         }

我的读书笔记(排序算法)

时间: 2024-10-01 11:21:52

我的读书笔记(排序算法)的相关文章

ios学习笔记---排序算法

排序算法 1.概念 所谓排序,就是使一串记录,按照其中的某个或某些关键字的大小,递增或递减的排列起来的操作.排序算法,就是如何使得记录按照要求排列的方法. 2.选择排序算法时常用的几个参照 a.稳定性 假定在带排序的记录序列中,存在多个具有相同关键字的记录,若经过排序,这些记录的相对次序保持不变,即在原序列中,ri = rj,且ri在rj之前,而在排序后的序列中,ri仍在rj之前,则称这种排序算法是稳定的:否则称为不稳定的. b.时间复杂度 c.空间复杂度 3.算法 冒泡排序 选择排序 插入排序

读书笔记-排序

[选择排序] a[i++] —> a[n],从前往后看.选择最小值.一次交换到位 1,完整循环找到数组中最小的元素: 2,把这个最小的元素与a[0]交换: 3,在a[i]-an的子数组中重复1-2步骤: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 for(int i = 0; i < n; i++) { int min = i; for(int j = i + 1; j < n; j++) { if(a[j] < min) min = j; } swap(i,

Java学习笔记——排序算法之希尔排序(Shell Sort)

落日楼头,断鸿声里,江南游子.把吴钩看了,栏杆拍遍,无人会,登临意. --水龙吟·登建康赏心亭 希尔算法是希尔(D.L.Shell)于1959年提出的一种排序算法.是第一个时间复杂度突破O(n2)的算法之一. 其基础是插入排序. 上代码: 1 public class ShellSort { 2 3 public static void shellSort(int[] arr){ 4 5 int increment = arr.length; 6 int temp;//牌 7 int i; 8

[算法学习笔记]排序算法——堆排序

堆排序 堆排序(heapsort)也是一种相对高效的排序方法,堆排序的时间复杂度为O(n lgn),同时堆排序使用了一种名为堆的数据结构进行管理. 二叉堆 二叉堆是一种特殊的堆,二叉堆是完全二叉树或者是近似完全二叉树.二叉堆满足堆特性:父节点的键值总是保持固定的序关系于任何一个子节点的键值,且每个节点的左子树和右子树都是一个二叉堆. 如上图显示,(a)是一个二叉堆(最大堆), (b)是这个二叉堆在数组中的存储形式. 通过给个一个节点的下标i, 很容易计算出其父节点,左右子节点的的下标,为了方便,

Java学习笔记——排序算法之进阶排序(堆排序与分治并归排序)

春蚕到死丝方尽,蜡炬成灰泪始干 --无题 这里介绍两个比较难的算法: 1.堆排序 2.分治并归排序 先说堆. 这里请大家先自行了解完全二叉树的数据结构. 堆是完全二叉树.大顶堆是在堆中,任意双亲值都大于(或等于)其孩子值,就称其为大顶堆. 堆排序的步骤: 1.把数组想象成一个堆.数组的index+1就是其对应在堆中的序号 2.调堆中各值的顺序,得到大顶堆 3.将堆首位值与堆末尾值交换,最大值排序完毕 4.将堆得大小减1,重复步骤2和步骤3,直到堆中只剩下一个元素.排序完毕 上代码: 1 publ

《数据结构与算法分析 C语言描述》读书笔记——分治算法

书中用求解最大子序列和的方式介绍了分治算法(divide-and-conquer) 分治算法是一种相对快速的算法 运行时间为O(logN) 最大子序列和的问题如下: 给出一组整数 A1  A2 … AN 求∑jk=i Ak 若所有整数均为负 则最大子序列和为0 e.g. 输入-2, 11,-4, 13, -5, -2 输出20(A2到A4) 分治算法就如同字面描述的一样 先分再治 分 指的是将问题分为两部分几乎相同的子问题 进行递归求解 治 指的是将 分 的解通过简单的手段合并 得到最终解 对于

Java学习笔记——排序算法之O(n&#178;)排序

男儿何不带吴钩,收取关山五十州.请君暂上凌烟阁,若个书生万户侯? --南园十三首 三种排序法: 1.冒泡法 2.简单选择法 3.直接插入法 上代码: 1.冒泡排序 1 public class BubbleSort { 2 3 //最简单的排序,从0开始逐个对比往上冒 4 public static void bubbleSort(int[] arr) { 5 for (int i = 0; i < arr.length-1; i++) { 6 for (int j = i+1; j < ar

?机器视觉算法与应用读书笔记(算法)

1.数据结构 2.图像增强 1. 灰度值变换 2. 辐射标定 3. 图像平滑 1. 时域去噪法 2. 空间域去噪法 均值滤波器 递归线性滤波器:将上次计算得到的值带入到下次的值中 缺点:噪声并不能被全部消除 高斯滤波器 高斯滤波器 4. 傅里叶变换 将函数h(x)从空间域转变到频率域 是一种可逆变换 3. 几何变换 1. 仿射变换 二维to二维之间的变换 对图像中的物体的尺寸进行修正(平移和旋转角度修正) 一般有一个2x2的线性部分和一个平移部分 2. 投影变换 高维to二维之间的变换 仿射变换

[读书笔记]算法(Sedgewick著)·第二章.初级排序算法

本章开始学习排序算法 1.初级排序算法 先从选择排序和插入排序这两个简单的算法开始学习排序算法.选择排序就是依次找到当前数组中最小的元素,将其和第一个元素交换位置,直到整个数组有序. 1 public static void sort(Comparable a[]){ 2 int N = a.length; 3 for(int i = 0; i < N; i ++){ 4 int min = i; //最小元素索引 5 for(int j = i + 1; j < N; j++){ 6 if(