算法快速回顾——排序算法

常用排序算法有以下几种:冒泡排序、插入排序、快速排序、归并排序、堆排序。

本文将对五种常用算法分析并实现。


//交换两个元素的值 这里列出几种不同写法
void swap(int *a, int *b)
{
int c = *a;
*a = *b;
*b = c;
}
void swap(int *a,int *b)
{
*a = (*a)^(*b);
*b = (*b)^(*a);
*a = (*a)^(*b);
}
void swap(int *a,int *b)
{
*a = *a + *b;
*b = *a - *b;
*a = *a - *b;
}

//冒泡排序
/*
原理:比较相邻的两个元素,将小的往前调,大的元素向后调。对于相等的元素可以保持原来的次序,该算法是稳定的排序算法。由于算法将大的元素逐渐移动到后面,因而称为冒泡排序
*/
void bubble_sort(int array[], int size)
{
int i,j,tmp;
for(i =0; i<size;++i)
for(j = size-1;j > i;--j)
if(array[j]<array[j-1])
swap(&array[j],&array[j-1]);
}

//插入排序
/*
原理:构建有序数列,对于未排序的元素插入到有序数列中,最终所有元素排序完成。
具体算法描述如下:
1、从第一个元素开始,该元素可以认为已经被排序
2、取出下一个元素,在已经排序的元素序列中从后向前扫描
3、如果该元素(已排序)大于新元素,将该元素移到下一位置
4、重复步骤3,直到找到已排序的元素小于或者等于新元素的位置
5、将新元素插入到该位置后
6、重复步骤2~5
*/
void insertion_sort(int array[], int first, int last)
{
int i,j,tmp;
for(i = first+1;i<=last;i++)
{
j = i-1;//j前面的是排序好的有序数列
tmp = array[i];
while( j >= first && array[j]>tmp)
{
array[j+1] = array[j];
j--;
}
array[j+1] = tmp;
}
}


//快速排序算法
/*
原理,通过一趟扫描将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列
*/
void swap(int *a, int *b)
{
int c = *a;
*a = *b;
*b = c;
}

int Partition(int array[], int low, int high)
{
    // 采用子序列的第一个元素为枢纽元素
    int pivot = array[low];
    while (low < high)
    {
        // 从后往前在后半部分中寻找第一个小于枢纽元素的元素
        while (low < high && array[high] >= pivot)
        {
            --high;
        }
        // 将这个比枢纽元素小的元素交换到前半部分
        array[low] = array[high];
        // 从前往后在前半部分中寻找第一个大于枢纽元素的元素
        while (low < high && array[low] <= pivot)
        {
            ++low;
        }
        // 将这个比枢纽元素大的元素交换到后半部分
        array[high] = array[low];
    }
    // 返回枢纽元素所在的位置
    return low;
}
// 快速排序
void QuickSort(int array[], int low, int high)
{
    if (low < high)
    {
        int n = Partition(array, low, high);
        QuickSort(array, low, n);
        QuickSort(array, n + 1, high);
    }
}

//归并排序

void merge(int[] unsorted, int first, int mid, int last, int[] sorted)
{
int i = first, j = mid;
int k = 0;
while (i < mid && j < last)
if (unsorted[i] < unsorted[j])
sorted[k++] = unsorted[i++];
else
sorted[k++] = unsorted[j++];

while (i < mid)
sorted[k++] = unsorted[i++];
while (j < last)
sorted[k++] = unsorted[j++];

for (int v = 0; v < k; v++)
unsorted[first + v] = sorted[v];
}

void merge_sort(int[] unsorted, int first, int last, int[] sorted)
{
if (first + 1 < last)
{
int mid = (first + last) / 2;
Console.WriteLine("{0}-{1}-{2}", first, mid, last);
merge_sort(unsorted, first, mid, sorted);
merge_sort(unsorted, mid, last, sorted);
merge(unsorted, first, mid, last, sorted);
}
}

图片和部分代码部分摘自维基百科:http://zh.wikipedia.org/wiki/%E6%8F%92%E5%85%A5%E6%8E%92%E5%BA%8F

算法快速回顾——排序算法,布布扣,bubuko.com

时间: 2024-10-24 17:43:40

算法快速回顾——排序算法的相关文章

普林斯顿公开课 算法3-7:排序算法复杂度

算法复杂度用来表示在解决某个问题时,算法的性能表现. 复杂度上限,就是某个具体的已经实现的算法能够保证在一定时间内解决问题 复杂度下限,就是通过数学方法证明,所有的算法都必须花费一定的时间才能解决问题 最优化算法,就是可能达到的最小复杂度的算法,通常介于复杂度上限和下限之间 比如排序问题中: 计算模型为决策树 使用比较次数作为开销依据 复杂度上限:使用归并排序可以达到N lgN复杂度 复杂度下限:? 最优化算法:? 决策树举例 有三个不同的元素a b c,通过比较的方式来得出排序结果.那么它的决

排序算法系列——八大排序算法对比分析

本系列最后一篇,综合分析下前面介绍的八种排序算法的效率,以及各自的适用情况. 下面先看看八种排序算法的时间复杂度表格: 图中八种排序被分成了两组,一组时间复杂度为O(n^2),另一组相对高效些. 下面先对第一组O(n^2)的四种排序算法进行对比,分别取数组长度为100,1000,10000,100000四个数量级,各个元素在0-10000000之间随机获取.下面看下结果的分析. 排序算法 长度=100 长度=1000 长度=10000 长度=100000 直接插入排序 535 2,198 135

算法:常用排序算法

最近整理了常用的排序算法,整理好,留下自己的思考过程. 1.冒泡排序: (1)平均时间复杂度:O(n2) (2)最好时间复杂度:O(n) (3)最坏时间复杂度:O(n2) (5)空间复杂度:O(1) (5)稳定性:稳定 (6)JavaScript实现: function bubble ( arr ) { var len = arr.length; var tmp; // 外层循环负责控制排序的趟数 for(var i = 0; i < len - 1; i++){ // 内层循环负责进行一趟排序

算法学习之排序算法:插入排序(直接插入排序、折半插入排序、2-路插入排序)

引言: 插入排序作为最简单易于理解的排序算法,基本实现比较简单.本文详细介绍直接插入排序,并给出实现,简单的介绍折半插入排序,并给出2-路插入排序和表插入排序两种插入排序,但并未给出具体实现. 一.直接插入排序 直接插入排序的基本操作是将一个记录插入到已排好序的有序表中,从而得到一个新的.记录数增1的有序表. 算法描述: 步骤1.将待排序的一组记录中的第1个记录拿出来作为一组有序的记录(当然此时该组记录仅有1个记录). 步骤2.依次将待排序的一组记录中的记录拿出来插入到前面已排好序的记录中. 步

数据结构与算法之——八大排序算法

附:关于这个主题,网上好的文章已经数不胜数,本篇是整合后的文章. 正文: 一.概述 排序算法可以分为内部排序和外部排序,内部排序是数据记录在内存中进行排序,而外部排序是因排序的数据很大,一次不能容纳全部的排序记录,在排序过程中需要访问外存. 本文所指八大排序就是内部排序. 当n较大,则应采用时间复杂度为O(nlog2n)的排序方法:快速排序.堆排序或归并排序序. 快速排序:是目前基于比较的内部排序中被认为是最好的方法,当待排序的关键字是随机分布时,快速排序的平均时间最短: 二.排序算法详述 1.

排序算法之简单排序算法

一.前言 其实排序对于前端工程师来说没有后端那么重要,不过理解排序的原理还是比较有用的.例如有些应用数据比较少量的就不需要用后台来排序,如果用php后端脚本等排序会增加后台的开销.放在前端岂不是更好,当然我们有一个前端的排序神器sort.当然也做了很多得优化,不过用sort排序还需要注意一点,sort默认不传参数时候的排序是按照字母顺序对数组中的元素进行排序,其实就是按照字符编码的顺序进行排序.        今天主要复习一下简单得排序,分别为冒泡排序.插入排序.选择排序,冒泡目前是我认为最简单

算法竞赛之排序算法初入门

关于排序的一些知识点 排序是计算机内经常进行的一种操作,其目的是将一组"无序"的记录序列调整为"有序"的记录序列.我们学习的排序是关于算法之中,对一些特定数据,按照一定的优先级顺序将数据及逆行合理化的排列,比如在最初学习C语言的时候,老师提到的冒泡排序.选择排序,这两个是基本的排序,原理也应该比较简单,其实最早接触到的就是两个数字比较大小,然后按升序或者降序排布的,这个应该是最早接触的排序了. 既然排序这么重要,我们就学习一下一些常见的排序算法吧,由于本人能力有限,

STL源码剖析——STL算法之sort排序算法

前言 由于在前文的<STL算法剖析>中,源码剖析非常多,不方便学习,也不方便以后复习,这里把这些算法进行归类,对他们单独的源码剖析进行讲解.本文介绍的STL算法中的sort排序算法,SGI STL中的排序算法不是简单的快速排序,而是交叉利用各种排序:堆排序.插入排序和快速排序:这样做的目的是提高效率,针对数据量比较大的采用快速排序,数据量比较小的可以采用堆排序或插入排序.注意:STL的sort排序算法的迭代器必须是随机访问迭代器. sort排序算法剖析 // Return a random n

冒泡排序算法和选择排序算法

这是最基本的两种排序算法,比它效率高的还有归并排序,堆排序,快速排序等算法,作为一个IT民工应该好好掌握. 冒泡排序和选择排序都有两层循环,下面逐一介绍: 冒泡排序: 1.外层循环,控制冒泡次数,起始从loop=1开始,结束标识是loop<length,循环length-1次(从数组的第二个数开始冒泡). 2.内层循环,选出对应轮的最大数,即第K轮冒泡选出的是第N-k-1大的数,故循环从loop=0开始,结束标志loop<N-k,循环N-k次. 选择排序: 1.外层循环,控制比较次数,第i轮设