算法——排序算法个人总结

总结:

O(n^2) 冒泡/插入/选择

O(nlogn) 高速/归并/堆

O(n^1.3) Shell排序

O(n) 桶/基数(位数区别不大。先低位排序后高位排序)/箱子

数据为正序时,插入和冒泡最佳。

稳定排序: 冒泡/插入/基数/归并。

不稳定排序:选择/高速/shell/堆。

邻近交换的排序基本上是稳定的。存在远距离交换的是不稳定排序。

详细代码例如以下:

#include<algorithm>
/*  冒泡排序:相邻元素比較。n为数据长度*/
template<typename T>
void BubbleSort(T* r, int n)
{   T temp; bool empty;
    for(int i=0;i<n-1;i++)
    {   empty=false;
        for(int j=0;j<n-1-i;j++)
            if(r[j]>r[j+1])
            {temp=r[j];r[j]=r[j+1];r[j+1]=temp; empty=true;}
        if(!empty)
            return ;
    }
}
/*高速排序:左边比他小,右边比他大,递归实现;
定义的一个重要数据,能够省去数据交换操作
low=0,high=数据长度-1*/
template<typename T>
void QuickSort(T a[],int low,int high)
{   if(low >=high)
        return ;
    T elem = a[low];    int l = low, r = high;
    while(l < r)
    {   while(l < r && a[r] >= elem) r--;
        if (l < r){ a[l++] = a[r];  }
        while(l< r && a[l] <= elem) l++;
        if (l < r)  {   a[r--] = a[l];  }
    }
    a[r] = elem;
    QuickSort(a,low,r-1);
    QuickSort(a,r+1,high);
}
/*插入排序:数据向右移动。a[j+1]=a[j]
n为数据长度*/
template<typename T>
void InsertSort(T a[],int n)
{  int i,j; T elem;
    for (i=1;i<n ;++i)
    {   j = i- 1;   elem = a[i];
        while(j>=0 && elem < a[j] ) {   a[j+1] = a[j];    j--;  }
        a[j+1] = elem;
    }
}
/*希尔(shell)排序:分组进行插入排序(把插入排序1的改成d就可以)
n为数据长度*/
template<typename T>
void ShellInsert(T arra[],int d,int n)
{  int i,j;  T elem;
    for ( i = d;i < n;i++)  //首个下标从d開始
    {   j = i - d;      elem = arra[i];
        while (j >= 0 && elem < arra[j])
        {  arra[j+d] = arra[j];   j = j - d;  }
        arra[j+d] = elem;
    }
}
template<typename T>
void ShellSort(T arra[],int n)
{  int inc = n;
    do  { inc = inc/2;
        ShellInsert(arra,inc,n);
    }   while (inc > 1);
}
/*选择排序:在未排序中找出最小的放在前面*/
template <typename T>
void SelectSort(T a[],int n)
{   T  elem;
    for (int i=0;i<n-1;i++)
    {   int elemNum = i;
        for (int j= i+1;j<n;j++)
            if (a[j] < a[elemNum])
                elemNum = j;
        if (elemNum != i)
        {   elem = a[i];    a[i] = a[elemNum];  a[elemNum] = elem;}
    }
}
/*归并排序:左边小取左边,左边++;右边小取右边,右边++*/
template<typename T>
void Merge(T arra[], int low, int mid, int high)
{   int k;   T *temp = new T[high-low+1];
    int begin1 = low, end1 = mid, begin2 = mid + 1, end2 = high;
    for (k = 0; begin1 <= end1 && begin2 <= end2; ++k)
    {   if(arra[begin1]<=arra[begin2])      temp[k] = arra[begin1++];
        else        temp[k] = arra[begin2++];
    }
    if(begin1 <= end1)
        for(int p=begin1;p<=end1;p++)   temp[k++]=arra[p];
    if(begin2 <= end2)
         for(int p=begin2;p<=end2;p++)   temp[k++]=arra[p];
    for(int s=left;s<=right;s++)      arra[s]=temp[s-left];
    delete []temp;
}
template<typename T>
void MergeSort(T arra[], unsigned int first, unsigned int last)
{   int mid = 0;
    if(first>=last) return;
    mid = (first+last)/2;
    MergeSort(arra, first, mid);
    MergeSort(arra, mid+1,last);
    Merge(arra,first,mid,last);
}
//*堆排序*/
template <typename E>
void HeapDown( E a[],int pos,int len)
{   E temp=a[pos]; int k=pos;//插入排序的思想
      for(int i=2*k+1;i<len;i=2*i+1)//下标从0開始
      { if(i<len-1 && a[i]<a[i+1]) i++;
            if(a[i]>temp) {a[k]=a[i];k=i;}
            else break;
      }
      a[k]=temp;
}
template <typename E>
void HeapSort( E a[],int n)
{     for(int i=n/2;i>=0;i--) HeapDown(a,i,n);//建堆
      for(int j=n-1;j>=1;j--)
      {     swap(a[j],a[0]);
            HeapDown(a,0,j);
      }
}
时间: 2024-10-15 05:45:50

算法——排序算法个人总结的相关文章

数据结构与算法-排序算法-partial

前言 都什么时代了,还写排序算法的总结? 原因有二.一是别人的精彩永远是别人的,你只有鼓掌的份儿:有些事情实际动手去做了才会有所体会. 二是排序算法是一类基础类的算法,不光是IT从业者真正入门的门槛,也是一些高级算法的关键部分或算法评估的benchmark. 计划说明的算法内容有哪些?  算法的思想.Java代码实现和平均算法复杂度.算法运行完整示例. 参考文献有哪些? wiki[EB/OL] Shaffer C. A. Data Structure and Algorithm Analysis

数据结构和算法-排序算法-冒泡排序

##################     排序算法        ###################### """ 排序算法, 我们想要把线性表中的无序序列,排成有序序列,的算法,就是排序算法, 排序算法的稳定性 举例:假设对下面的元组要以他们的第一个数字来排序. (4, 1) (3, 1) (3, 7)(5, 6) 如果你排序之后,(3, 1) (3, 7)和原来的顺序一样,就是稳定的,否则就是不稳定的, (3, 1) (3, 7) (4, 1) (5, 6) (维

JavaScript算法-排序算法

? 此生之路,我将走过:走过这一次,便再也无法重来.所有力所能及的善行,所有充盈于心的善意,我将毫不吝惜,即刻倾予.我将再不拖延,再不淡漠,只因此生之路,再也无法重来. 对计算机中存储的数据执行的两种最常见操作是排序和索引.下述阐述的排序方式,暂且都是用数组进行测试(从小到大). var dataAry = [5, 4, 3, 7, 1, 2, 8, 6, 9]; // 测试数组 /** *[工具方法]交换数组中两个值 * @param ary 数组 * @param i 下标i * @para

数据结构与算法——排序算法

常见排序算法主要有: 插入排序(直接插入排序.希尔排序) 选择排序(直接选择排序.堆排序) 交换排序(冒泡排序.快速排序) 归并排序 基数排序 外部排序 一.直接插入排序 算法思想:在一个待排序列中,从第二个元素开始,依次进行排序,每次都将待排序元素从后往前,依次与前面的元素进行比较,从而将带排序元素移动到一个合适的位置,直到最后一个待排序元素移动到合适位置,则排序完成. 算法特点:最好情况下时间复杂度O(n),最坏情况下时间复杂度O(n2),稳定排序算法 二.希尔排序 希尔排序算法基础:待排序

[数据结构与算法]排序算法(Python)

1.直接插入排序 给定一个数组后,从第二个元素开始,如果比第一个小,就跟他交换位置,否则不动:第三个元素如果比第二个小,把第三个跟第二个交换位置,在把第二个与第一个比较:..... def insert_sort(arr): length = len(arr) for i in range(1,length): if arr[i] < arr[i-1]: for j in range(i-1,-1,-1): if arr[j+1] < arr[j]: arr[j+1],arr[j] = arr

算法 排序算法--冒泡排序

冒泡排序是排序算法的一种,思路清晰,代码简洁,常被用在大学生计算机课程中. “冒泡”这个名字的由来是因为越大的元素会经由交换慢慢“浮”到数列的顶端,故名. 这里以从小到大排序为例进行讲解. 基本思想及举例说明 冒泡排序的基本思想就是不断比较相邻的两个数,让较大的元素不断地往后移.经过一轮比较,就选出最大的数:经过第2轮比较,就选出次大的数,以此类推. 下面以对 3  2  4  1 进行冒泡排序说明. 第一轮 排序过程3  2  4  1    (最初)2  3  4  2    (比较3和2,

算法 排序算法--选择排序

选择排序是排序算法的一种,这里以从小到大排序为例进行讲解. 基本思想及举例说明 选择排序(从小到大)的基本思想是,首先,选出最小的数,放在第一个位置:然后,选出第二小的数,放在第二个位置:以此类推,直到所有的数从小到大排序. 在实现上,我们通常是先确定第i小的数所在的位置,然后,将其与第i个数进行交换. 下面,以对 3  2  4  1 进行选择排序说明排序过程,使用min_index 记录当前最小的数所在的位置. 第1轮 排序过程 (寻找第1小的数所在的位置)3  2  4  1(最初, mi

《算法 - 排序算法》

一:参考 - 十大经典排序算法动画与解析,看我就够了!(配代码完全版) - 这个动画很形象了,自己也对排序算法重新总结了下(PHP版本) - Github Sort 二:算法详解 <?php /** * https://www.cnblogs.com/fivestudy/p/10212306.html * 排序算法 时间复杂度 最优 最差 稳定性 * 冒泡排序 O(n^2) O(n) O(n^2) 稳定 * 选择排序 O(n^2) O(n^2) O(n^2) 不稳定 * 插入排序 O(n^2)

数据结构与算法---排序算法(Sort Algorithm)

排序算法的介绍 排序也称排序算法 (Sort Algorithm),排序是将一组数据,依指定的顺序进行排列的过程. 排序的分类 1) 内部排序: 指将需要处理的所有数据都加载 到内部存储器(内存)中进行排序. 2) 外部排序法:数据量过大,无法全部加载到内 存中,需要借助外部存储(文件等)进行 排序. 常见的排序算法分类 算法的时间复杂度 度量一个程序(算法)执行时间的两种方法 1.事后统计的方法这种方法可行, 但是有两个问题:一是要想对设计的算法的运行性能进行评测,需要实际运行该程序: 二是所

算法 - 排序算法的稳定性

排序算法的稳定性 排序的稳定性,指原有数据相同值的原始次序不变. 可以: 冒泡排序遇到相等的数不交换即可做到稳定. 插入排序,遇到相等的数即停止比较,插入数组. 归并排序 merge 过程中,遇到相等的值先填入左区域的值就可以做到稳定. 不可以: 选择排序不能做到稳定性,选择数值的时候交换数字是会打乱原始的次序. 随机快排不具有稳定性,因此荷兰国旗问题也是不能做到稳定性的. 堆排序. 稳定性的意义: 现实工程中需要保持上一次排序时遗留的信息,比如学校的成绩排序,第一次查询以成绩高低排序,第二次查