排序算法C++实现 理论部分自己理解

/////交换两个数据template <typename T>
 void Swap(T &a,T &b)
{
    a=a^b;
    b=a^b;
    a=a^b;
}
template <typename T>
void prin(T Arr[], int len)
{
    for (int i=0; i<len; i++)
    {
        cout<<Arr[i]<<"  ";
    }
    cout<<endl;
}

/////直接插入排序
template <typename T>
void InsertSort(T* pt, int len)
{
    if ((pt == NULL) || (len <=0))
    {
        cout<<"input parameter error"<<endl;
        return;
    }
    for (int i=0; i<len-1 ; i++)//////需要比较测试:len-1次,即[0, len-1)
    {
        for (int j=i+1; j>=1; j--)
        {
            if (pt[j-1] >pt[j])
                Swap(pt[j-1], pt[j]);
        }
    }
}
/////shell排序是直接插入排序的改进
template <typename T>
void shell(T* Arr, int len, int incr)
{
    if ((Arr == NULL) || (len<=0) ||(incr<=0))
    {
        return;
    }
    int i=0;
    for ( i=0; i < len-incr; i++)
    {
        ////i = [0-incr),倍数相邻的两个元素比较排序.
        ////i = [incr, 2*incr)倍数相邻的三个元素排序     ////依次类推      for (int j = i+incr; j>=incr; j-=incr)
        {
            if (Arr[j-incr] >Arr[j] )
                Swap(Arr[j-incr], Arr[j]);
        }
    }

}
template <typename T>
void ShellSort(T* Arr, int len)
{
    if (Arr = NULL || len <=0)
        return;
    int incr = len;
    do
    {
        incr = incr/3+1;
        shell<T>(Arr, len, incr);
    } while (incr >1);
}

template <typename T>
void bubbleSort(T* Arr, int len)
{
    bool exchang = false;
    for (int i=0; i<len-1; i++)
    {
        exchang = false;
        for (int j=0 ; j<len-1-i; j++)
        {
            if (Arr[j] > Arr[j+1])
            {
                exchang = true;
                Swap(Arr[j], Arr[j+1]);
            }
        }
        if (!exchang)
            break;
    }
}
template <typename T>
void SelectSort(T* Arr, int len)
{
    for (int i=0; i<len; i++)
    {
        int k= i;
        for (int j=i+1; j<len; j++)
        {
            if (Arr[k] >Arr[j])
                k = j;
        }
        Swap(Arr[k], Arr[i]);
    }
}

/////创建堆
////数组的非降序排列  大根堆
////数组的非升序排列  小根堆
template <typename T>
void HeapAdjust(T* Arr, int s, int length)
{
    T temp = Arr[s];
    //s代表带调整的根节点
    int child = 2*s+1;
    while (child< length)
    {
        //创建小堆  非升序排列
        if (child+1<length && Arr[child + 1]   < Arr[child])
        {
            ++child;/////child为左右孩子中值较小的孩子的位置
        }
        if (Arr[child] < Arr[s])
        {
            Arr[s] = Arr[child];
            s= child;
            child = 2*s+1;
        }
        else
            break;
        Arr[s] = temp;
    }
}
template <typename T>
void BuildingHeap(T H[], int length)  ///length 下标的位置
{
    //最后一个有孩子结点的节点位置 i=  length/ 2  -1
    ///从下到上,一次筛选,构建堆
    for (int i = length / 2 -1; i >= 0; --i)
        HeapAdjust(H,i,length);  

}
template <typename T>
void HeapSort(T* Arr, int len)
{
    BuildingHeap(Arr, len);
    cout<<"BuildHeap:"<<endl;
    prin(Arr, len);
    ////堆顶元素和堆中最后一个元素交换之后,对堆进行调整
    for (int i= len -1; i>0; --i)
    {
        Swap<T>(Arr[i], Arr[0]);
         /*T temp = Arr[i]; Arr[i] = Arr[0]; Arr[0] = temp; */////////////////
        HeapAdjust<T>(Arr, 0, i);
    }
}

template <typename T>
void QuickSort(T* Arr, int left, int right)
{
    if (left >right)
        return;
    int low = left;
    int high = right;
    T temp = Arr[left];
    while(low < high)
    {
        while((low < high)&& (Arr[high] >= temp))
            high--;
        while((low < high)&& (Arr[low] <= temp))
            low++;
        if (low <high)
            Swap(Arr[low], Arr[high]);
    }
    Arr[left] = Arr[low];
    Arr[low] = temp;

    QuickSort(Arr, left, low-1);
    QuickSort(Arr, low+1, right);
}
template <typename T>
void Merge(T* Arr, int st, int md, int ed, T* temp)
{
    int s= st;  int m = md;   int e = ed;
    int mm = md+1;
    int index = 0;
    while (s<=m && mm <=e)
    {
        if (Arr[s] < Arr[mm])
            temp[index++] = Arr[s++];
        if (Arr[mm] < Arr[s])
            temp[index++] = Arr[mm++];
    }
    while (s<=m)
        temp[index++] = Arr[s++];
    while (mm<=e)
        temp[index++] = Arr[mm++];
    for (int i=0; i<index; i++)
        Arr[st+i] = temp[i];
}
template <typename T>
void MgerSort(T* Arr, int st, int ed, T* temp)
{
    if (Arr == NULL ||st<0 || ed <0 || temp == NULL)
    {
        return ;
    }
    if (st < ed)
    {
        int md = (st+ed)/2;
        MgerSort(Arr, st, md, temp );
        MgerSort(Arr, md+1, ed, temp);
        Merge(Arr, st, md, ed, temp);
    }
}
时间: 2024-08-25 06:47:02

排序算法C++实现 理论部分自己理解的相关文章

算法学习#09--用简单的思维理解选择、插入、冒泡和希尔排序

选择排序 1.原理 首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置,然后,再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾.以此类推,直到所有元素均排序完毕. 2.特点 ①运行时间与输入无关. 无论输入初始状态如何,是否有序,都需要遍历数组来找出最小的元素.其他算法则更善于利用输入的初始状态来优化时间. ②数据移动次数最小. 如果某个元素位于正确的最终位置上,则它不会被移动.选择排序每次交换一对元素,它们当中至少有一个将被移到其最终位置上,因此对n个元素的表进

深入理解排序算法(一):初级排序算法

[本系列博文会对常见的排序算法进行分析与总结,并会在最后提供几道相关的一线互联网企业面试/笔试题来巩固所学及帮助我们查漏补缺.项目地址:https://github.com/absfree/Algo.由于个人水平有限,叙述中难免存在不清晰准确的地方,希望大家可以指正,谢谢大家:)] 一.概述 我们在日常开发中经常需要对一组数据对象进行排序,这里的数据对象不仅包括数字,还可能是字符串等抽象数据类型(Abstract Data Type).由于排序是很多其他操作(比如二分查找)能够高效进行的基础,因

最易理解的qsort排序算法

快速排序算法程序可以写得千奇百怪,但最易理解的个人认为仍是下面的: #include<stdio.h> #include<time.h> #include<stdlib.h> void swap(int *a ,int *b) { int t = *a; *a = *b; *b = t; } int partition(int array[],int l,int r) { int pivot = array[r]; int curpos = l; int j ; for

个人理解排序算法的重要性

这几天再看排序,有提到排序稳定性的问题.排序分为稳定(冒泡排序.插入排序.归并排序.基数排序)和不稳定(选择排序.快速排序.希尔排序.堆排序). 看见过一个面试题问过排序算法稳定性的应用,当时不怎么理解,现在整理出来一些思绪. 给出一组数据(比如学生信息),每个数据都有不同的属性(成绩A,成绩B,等等).加入现在成绩A是第一排序元素,成绩B是第二排序.这样可以先用排序算法(稳定和不稳定都可以)将所有学生按照成绩B排序,接下用成绩A排序.这样相同成绩B的学生就可以按照成绩A的先后输出. 现在逐个输

对Shell排序算法的理解

Shell排序算法的基础是插入排序算法,所以在开始讲Shell排序算法之前,先讲讲插入排序算法. 我们先来看一个简单的小问题,给出一个已经排序好的数组arr以及另外一个数字n,如何将n放入到数组arr中,使得放入n后arr内的所有数字依然是有序的? int arr[10] = {3,4,7,8,10,33,56,66,100}; int n = 47; 显然我们想要的结果是{3,4,7,8,10,33,47,56,66,100},那么具体该怎么做呢?很容易就可以想到,最简单的做法就是从数组中最大

总结: Sort 排序算法

排序总结 面试经验 硅谷某前沿小Startup面试时,问到的一个题目就是写一个快速排序算法.进而面试官问到了各种算法的算法复杂度,进而又问了Merge Sort 与 QuickSort 的优劣. 对排序算法的全面理解,体现了计算机学生的功底. 现在来讲Merge Sort 与Quick Sort 是最流行的算法,以下我们来一步一步地分析: SORT分类 在计算机科学所使用的排序算法通常被分類為: 計算的時間複雜度(最差.平均.和最好表現),依據串列(list)的大小(n).一般而言,好的表現是O

若干排序算法简单汇总(一)

转载请注明出处 http://blog.csdn.net/pony_maggie/article/details/35819279 作者:小马 从题目看,首先不是全部是若干.排序算法很多,我个人的能力也有限,不可能都讲到.另外,是简单汇总,是希望能用最简单的代码,最简短的语言说明问题,不搞太多理论分析. 就像前面说的,排序算法有很多,而且不存在哪一种最不好,哪一种最好这样的说法.根据用途不同选择最适合的就行了.不过仅从时间复杂度来看,基本上有两种,一种是O(n^2), 一种是O(nlogn).

js十大排序算法详解

十大经典算法导图  图片名词解释:n: 数据规模k:"桶"的个数In-place: 占用常数内存,不占用额外内存Out-place: 占用额外内存 1.冒泡排序 1.1  原始人冒泡排序 function bubbleSort(arr) { var len = arr.length; for (var i = 0; i < len; i++) { for (var j = 0; j < len - 1 - i; j++) { if (arr[j] > arr[j+1]

常用排序算法的python实现和性能分析

http://www.cnblogs.com/wiki-royzhang/p/3614694.html 一年一度的换工作高峰又到了,HR大概每天都塞几份简历过来,基本上一天安排两个面试的话,当天就只能加班干活了.趁着面试别人的机会,自己也把一些基础算法和一些面试题整了一下,可以阶段性的留下些脚印——没办法,平时太忙,基本上没有时间写博客.面试测试开发的话,这些也许能帮得上一些. 这篇是关于排序的,把常见的排序算法和面试中经常提到的一些问题整理了一下.这里面大概有3个需要提到的问题: 虽然专业是数