基本排序算法总结(摘录及笔记)

1.插入排序

插入排序时最容易理解的排序方法,个人总结有三个关键点:

1. 需要将处理的元素暂时存储起来

2. j变量的范围控制

3. 插入值与j变量控制范围中元素大小的比较

相关代码:

 1 //插入排序
 2 template<class T> void sort(T* array, int n)
 3 {
 4     for (int i = 1; i < n; i++)
 5     {
 6             T temp = array[i];                                              //控制j的范围
 8             for (int j = i; j > 0 && array[j - 1] > temp; j--)  //在范围内进行比较
 9       {
10                 array[j] = array[j - 1];
11       }
12             array[j] = temp;
13     }
14 }

---------------------------------------------

2. The Merge Sort

---------------------------------------------

过程:先分割,后合并,合并过程先建立一个零时数组

 1 template<class T> void merge(T* a, int n1, int n2)
 2 {
 3     T* temp = new T[n1+n2];
 4     int i  =0;
 5     int j1=0;
 6     int j2=0;
 7 //若左段,右段均在区域内,则选择小的填入新数组中
 8     while (j1 < n1 && j2 < n2)
 9     {
10         temp[i++] = ( a[j1] <= a[n1+j2] ? a[j1++] : a[n1+j2++] );
11     }
12 //若右段填完,左段有空余,则将左段所有填入新数组
13     while (j1 < n1)
14     {
15         temp[i++] = a[j1++];
16     }
17 //若左段填完,右段有空余,则将左段所有填入新数组
18     while (j2 < n2)
19     {
20         temp[i++] = a[n1+j2++];
21     }
22
23     for (i=0; i < n1+n2; i++)
24     {
25           a[i] = temp[i];
26     }
27     delete [] temp;
28 }
29 template<class T> void sort(T* a, int n)
30 {
31     if (n > 1)
32    {
33         int n1 = n/2;
34         int n2 = n - n1;
35         sort(a, n1);
36         sort(a+n1, n2);
37         merge(a, n1, n2);
38     }
39 }

---------------------------------------------------

The Shell Sort

---------------------------------------------------

// The Shell Sort
templat<class T> void sort(T* a, int n)
{
    int d = 1;
    int  j = 0;  //设定j为全局变量
 //首先确定跳跃的距离,根据不同的长度的数组有不同的跳跃距离
    while (d<n/9)
    {
        d = 3*d + 1;
    }
    while (d>0)
  //做跳跃增量插入排序
    {
         for (int i=d; i<n; i++)
         {
           T t = a[i];  //将需要被插的数显保存
           j=i;
           while (j>=d && a[j-d]>t)
           {
                a[j] = a[j-d];
                j -= d;
           }
           a[j] = t;
         }
         d /= 3;  减少增量大小,继续做插排
      }
}

-------------------------------------------------------------

The Heap Sort (堆排序)

-------------------------------------------------------------

堆排序最重要的就是建立堆

template<class T> void sort(T* a, int n)
//非叶子节点都需要进行heapify,n为数组元素数量
{ for (int i= n/2 - 1; i >=0; i--)
    heapify(a, i , n);
  for (int i = n-1; i > 0; i--)
  {     swap(a[0], a[i]);  //先交换
    // Invariant: the elements a[i:n-1] are in correct positions.
    heapify(a, 0 , i);  //后建堆
    // Invariant: the subarray a[0:i-1] has the heap property
  }
}
//建堆的方法依赖于数组中序号的互相关系
//在堆中元素K的子元素为2k+1和2k+2,k的父元素为(k-1)/2
template <class T> void heapify(T* a, int k, int n)
{   T t = a[k];
  while (k < n/2)
  {     int j = 2*k + 1;                    // 定位到左子结点
    if (j+1 < n && a[j] < a[j+1])  ++j; //若有右子结点,且右大于左边
    if (t > a[j])  break;               //比较父节点与子节点大小
//此处隐藏有一级子节点必然都大于二级及三级子节点
    a[k] = a[j];
    k = j;
  }
  a[k] = t;
}

-----------------------------------------------------

快排

-----------------------------------------------------

确定pivot,设定两端起始点与Pivot比较移动位置。

template<class T> void quickSort(T* a, int lo, int hi)
{
  if (lo >= hi) return;
  T pivot = a[hi];                          //确定Pivot
  int i = lo - 1;                           //定位左边初始位置,为-1即第一个元素前一个
  int j = hi;                               //由于最后一个是Pivot所以其实也是空的
  while (i < j)
  {
    while (a[++i] < pivot) ;                //移动左边,注意先移动位置,后比较大小
    while (j >= 0 && a[--j] > pivot) ;      //移动右边,先移动位置后比较大小并确保j>0
    if (i < j)     swap(a[i], a[j]);                       //交换元素,左右停止的位置
  }
  swap(a[i], a[hi]);                        //交换左边与pivot
  quicksort(a, lo, i-1);                    //左边起始到pivot前一个元素
  quicksort(a, i+1, hi);                    //pivot后一个到右边
}

template<class T> void sort(T* a, int n)
{ quicksort(a, 0, n-1);
}
 
时间: 2024-08-26 03:09:01

基本排序算法总结(摘录及笔记)的相关文章

GDI+学习笔记(九)带插件的排序算法演示器(MFC中的GDI+实例)

带插件的排序算法演示器 本节将通过一个实例来说明GDI+在MFC中的应用.这个算法演示器其实是本人算法系列的一个开端,由于csdn没有树状的目录结构,咱也只好使用链表了不是?好了,废话不多说,开始今天的文章. (一)功能说明 我们初步制定功能如下: (1). 能够通过柱状图,自动展示排序算法的交换比较过程 (2). 能够使用插件的形式进行开发.即,当新完成一个算法后,只需要完成一个插件文件(我们这里使用动态库dll),由主程序加载插件,即可进行执行,而不再需要重新编译主程序. (3). 保证主程

STL笔记(6)标准库:标准库中的排序算法

STL笔记(6)标准库:标准库中的排序算法 标准库:标准库中的排序算法The Standard Librarian: Sorting in the Standard Library Matthew Austern http://www.cuj.com/experts/1908/austern.htm?topic=experts 用泛型算法进行排序    C++标准24章有一个小节叫“Sorting and related operations”.它包含了很多对已序区间进行的操作,和三个排序用泛型

[读书笔记]算法(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(

八大排序算法学习笔记:冒泡排序

冒泡排序(Bubble Sort,台湾译为:泡沫排序或气泡排序)是一种简单的排序算法. 它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来.走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成.这个算法的名字由来是因为越小的元素会经由交换慢慢"浮"到数列的顶端. 算法原理: 比较相邻的元素.如果第一个比第二个大,就交换他们两个. 对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对.在这一点,最后的元素应该会是最大的数. 针对所有

八大排序算法学习笔记:插入排序(一)

插入排序     包括:直接插入排序,二分插入排序(又称折半插入排序),链表插入排序,希尔排序(又称缩小增量排序).属于稳定排序的一种(通俗地讲,就是两个相等的数不会交换位置) . 直接插入排序: 1.算法的伪代码(这样便于理解):     INSERTION-SORT (A, n)             A[1 . . n] for j ←2 to n do key ← A[ j] i ← j – 1 while i > 0 and A[i] > key do A[i+1] ← A[i]

八大排序算法学习笔记:插入排序(二分插入排序)

二分插入排序   也称折半插入排序, 1.基本思想:设数列[0....n]分为两部分一部分是[0...i]为有序序列,另一部分是[i+1.....n]为无序序列,从无序序列中取一个数 x ,利用二分查找算法找到 x 在有序序列中的插入位置并插入,有序序列还是有序的,接下来重复上述步骤,直到无序序列全部插入有序序列 ,这是整个序列只剩下有序序列即有序了. 2.代码:    3.复杂度: 用二分插入排序所要进行的总比较次数为O(lgn),当n较大时,比直接插入排序的最大比较次数小得多,但大于最小比较

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

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 /// 快

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

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

Java笔记(07):常见对象--StringBuffer、二分查找及排序算法

1.StringBuffer类的构造方法 1 package cn.itcast_01; 2 3 /* 4 * 线程安全(多线程讲解) 5 * 安全 -- 同步 -- 数据是安全的 6 * 不安全 -- 不同步 -- 效率高一些 7 * 安全和效率问题是永远困扰我们的问题. 8 * 安全:医院的网站,银行网站 9 * 效率:新闻网站,论坛之类的 10 * 11 * StringBuffer: 12 * 线程安全的可变字符串. 13 * 14 * StringBuffer和String的区别? 1