C/C++ 知识点---排序实现

1.冒泡排序
冒泡排序是O(N^2)复杂度的排序算法,效率较低,需要N趟遍历,每次将候选集中最小的数通过交换浮到最上面;
template <typename Type>
void BubbleSort(vector<Type> &arraySort, int lowIndex, int hightIndex)
{
    bool bChange;
    for (int i=lowIndex; i<hightIndex; ++i)
    {
        bChange = false;
        for (int j=hightIndex; j>i; --j)
        {
            if (arraySort[j-1] > arraySort[j])
            {
                swap(arraySort[j-1], arraySort[j]);
                bChange = true;
            }
        }

if (!bChange)
        {
            return;
        }
    }
}

2.选择排序
选择排序就是每次在候选集合中选择最小的数插入到候选结合的开头,并且不断的缩小候选集合的过程,从算法实现的角度讲,就是要进行N词遍历,每次在候选集合中选择最小的数放在候选集合前部的过程,并且不断的缩小候选集。
template <typename Type>
void SelectSort(vector<Type> &arraySort, int lowIndex, int hightIndex)
{
    Type tempMinIndex;
    for (int i=lowIndex; i<hightIndex; ++i)
    {
        tempMinIndex = i;
        for (int j=i+1; j<hightIndex; ++j)
        {
            if (arraySort[j] < arraySort[tempMinIndex])
            {
                tempMinIndex = j;
            }
        }

if (tempMinIndex != i)
        {
            swap(arraySort[tempMinIndex], arraySort[i]);
        }
    }
}

3.插入排序
每次将一个数插入到有序的集合中,从算法实现的角度讲,就是进行N趟遍历,每次将第i个数插入到前面有序的集合中,最后达到有序。算法的复杂度为O(N^2),在实现时将第i个数与前面的i-1个数进行比较,如果小于就交换,最后插入到合适的位置。
template <tepename Type>
void InsertSort(vector<Type> &arraySort, int lowIndex, int hightIndex)
{
    for (int i=lowIndex+1; i<hightIndex; ++i)
    {
        Type tempValue = arraySort[i];
        j = i-1;
        while (j>=0 && temValue<arraySort[j])
        {
            arraySort[j+1] = arraySort[j];
            --j;
        }
        arraySort[j+1] = tempValue;
    }
}

4.快速排序
快速排序是最常用的也算是经典的排序算法,它是通过分治递归的方式实现,通过选取哨兵,并将元素与哨兵比较,按照大小将数组切分成两部分,并对这两部分按照同样的方式进行递归计算,最后达到有序。
template <typename Type>
void QuickSort(vector<Type> &arrarSort, int lowIndex, int hightIndex)
{
    int i = lowIndex;
    int j = hightIndex;
    Type tempValue = arraySort[lowIndex];

while (i < j)
    {
        while (i<j && arraySort[j]>=tempValue)
        {
            j--;
        }
        if (i < j)
        {
            arraySort[i++] = arraySort[j];
        }

while (i<j && arraySort[i]<tempValue)
        {
            i++;
        }
        if (i < j)
        {
            arraySort[j--] = arraySort[i];
        }

QuickSort(arraySort, i+1, hightIndex);
        QuickSort(arraySort, lowIndex; i-1);
    }

arraySort[i] = tempValue;
}

5.归并排序
归并排序也是用分治递归的思想进行求解,想将小块进行排序,然后合并来实现,归并排序的算法复杂度是O(N*logN),空间复杂度是O(N)
template <typename Type>
void Merge(vector<Type> &arraySort, int leftIndex, int midIndex, int rightIndex)
{
    int i = leftIndex;
    int j = midIndex+1;
    int n1 = midIndex-leftIndex+1;
    int n2 = rightIndex-midIndex;
    int k = 0;

Type *tempArray = new Type[n1+n2];
    while (i<=midIndex && j<=rightIndex)
    {
        if (arraySort[i] < arraySort[j])
        {
            tempArray[k++] = arraySort[i++];
        }
        else
        {
            tempArray[k++] = arraySort[j++];
        }
    }

while (i <= midIndex)
    {
        tempArray[k++] = arraySort[i++];
    }
    while (j <= rightIndex)
    {
        tempArray[k++] = arraySort[j++];
    }

for (int i=0; i<n1; ++i)
    {
        arraySort[leftIndex++] = tempArray[i];
    }
    tempIndex = midIndex+1;
    for (int i=0; i<n2; ++i)
    {
        arraySort[tempIndex++] = tempArray[n1+i];
    }

delete []tempArray;
}

template <typename Type>
void MergeSort(vector<Type> &arraySort, int leftIndex, int rightIndex)
{
    if (leftIndex < rightIndex)
    {
        int midIndex = (leftIndex+rightIndex)/2;
        MergeSort(arraySort, leftIndex, midIndex);
        MergeSort(arraySort, midIndex+1, rightIndex);
        Merge(arraySort, leftIndex, midIndex, rightIndex);
    }
}

时间: 2024-12-22 13:08:30

C/C++ 知识点---排序实现的相关文章

11、前端知识点--排序

一.sort排序法 1.不传参数,将不会按照数值大小排序,按照字符编码的顺序进行排序: var arr = ['General','Tom','Bob','John','Army']; var resArr = arr.sort(); console.log(resArr);//输出 ["Army", "Bob", "General", "John", "Tom"] var arr2 = [30,10,11

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

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

ACM知识点清单

本文直接来源http://blog.csdn.net/xuanandting/article/details/52160859,如有侵权,请联系删除. 训练过ACM等程序设计竞赛的人在算法上有较大的优势,这就说明当你编程能力提高之后,主要时间是花在思考算法上,不是花在写程序与debug上. 下面给个计划你练练: 第一阶段:练经典常用算法,下面的每个算法给我打上十到二十遍,同时自己精简代码,因为太常用,所以要练到写时不用想,10-15分钟内打完,甚至关掉显示器都可以把程序打出来. 1.最短路(Fl

js 十个排序方法

引子 有句话怎么说来着: 摩擦摩擦是魔鬼的步伐 当年,想凭借抱Java大腿火一把而不惜把自己名字给改了的JavaScript(原名LiveScript),如今早已光芒万丈.node JS的出现更是让JavaScript可以前后端通吃.虽然Java依然制霸企业级软件开发领域(C/C + +的大神们不要打我...),但在Web的江湖,JavaScript可谓风头无两,坐上了头把交椅. 然而,在传统的计算机算法和数据结构领域,大多数专业教材和书籍的默认语言都是Java或者C/C+ +.这给最近想恶补算

学习、实践分析取舍,工作学习总结

列举: 工作快要一年了,最近发现自己想要学习的东西非常多,已经到了完全应付不过来的程度.看来需要列举一下,然后分一下主次关系: 这些就是目前我想要学习的知识点: 1.C++.C语言基础知识 2.cocos2dx游戏引擎 3.android应用基础知识和eclipse.ADT.CDT.ANT.NDK.SDK基本知识点 4.xcode.object-c和mac基础知识点 5.openGL相关知识 6.lua语言基础知识 7.Linux和unix编程基础 8.编译.链接.装载,静态库.动态库 9.计算

JavaScript实现10大算法

在传统的计算机算法和数据结构领域,大多数专业教材和书籍的默认语言都是Java或者C/C+ +.当我了解到有一本叫做<数据结构与算法JavaScript描述>时,觉得它是一本很好的针对前端开发者们的入门算法书籍.有一个问题是,很多重要的算法和数据结构知识并没有在这本书里被提到.这些问题对于作为一个晚期强迫症患者的我来说简直不能忍.于是乎,一言不合我就决定自己找资料总结算法.那么,我就从算法领域里最基础的知识点——排序算法总结起好了. 十大经典算法概括图 名词解释: n:数据规模 k:“桶”的个数

ExtJS4.2 Grid知识点七:显示行号、斑马线效果(奇偶行背景色不一致)、复制单元格文字、禁止点击列排序

本节主要学习ExtJS4.2 Grid显示行号.斑马线效果(奇偶行背景色不一致).复制单元格文字.禁止点击列排序.禁止列头部右侧菜单,示例图片: 在线演示  /  在线演示 主要内容如下: 显示行号 斑马线效果(奇偶行背景颜色不一致) 复制单元格问题 禁止点击列排序 禁止列头部右侧菜单 1.显示行号 在Grid中增加行号列,xtype指定为rownumberer. {header: 'NO',xtype: 'rownumberer',width: 40,sortable: false} 2.斑马

每天一个JS 小demo之表单排序。主要知识点:DOM中的表单操作,节点操作

<!DOCTYPE html><html lang="en"><head><meta charset="UTF-8"><title>Document</title><script type="text/javascript">window.onload = function(){ var input = document.querySelectorAll('inp

[知识点]拓扑排序

// 此博文为迁移而来,写于2015年2月24日,不代表本人现在的观点与看法.原始地址:http://blog.sina.com.cn/s/blog_6022c4720102vspe.html 1.前言 在了解拓扑排序之前,我们先来看一道题目以更好的理解: 一个较大的工程往往被划分成许多子工程,我们把这些子工程称作活动(activity).在整个工程中,有些子工程(活动)必须在其它有关子工程完成之后才能开始,也就是说,一个子工程的开始是以它的所有前序子工程的结束为先决条件的,但有些子工程没有先决