美文网首页
排序算法

排序算法

作者: 稀饭粥95 | 来源:发表于2018-08-04 19:38 被阅读8次

快速排序

对于快速排序需要了解

  • 快速排序的平均复杂度?最坏复杂度?
  • 是否是稳定排序?

快速排序也是一种分治算法

#include <iostream>
#include <vector>
#include <stack>
#include <map>
#include "header.h"
using namespace std;

int arrs[] = {9,1,2,3,4,6,7,4,8,4,6,3,4 };
int arrLen = sizeof(arrs) / sizeof(arrs[0]);

void Swap(int *arrs,int i,int j){
    int temp = arrs[i];
    arrs[i] = arrs[j];
    arrs[j] = temp;
}
int Partition(int arrs[],int low,int high)
{
    int key = arrs[high];
    int i=low-1,j=low;//i后面的数都比key小
    for(;j<high;j++){
       if(arrs[j]<key){
          i++;
          Swap(arrs,i,j);
       }
    }
    Swap(arrs,i+1,high);
    return i+1;
}

void quickSort(int arrs[],int low,int high)
{
    if(low < high)
    {
        int d=Partition(arrs,low,high);
        quickSort(arrs , low, d-1);
        quickSort(arrs , d+1, high);
    }
}



int main()
{
    quickSort(arrs,0,arrLen-1);
    for (int i = 0; i < arrLen; i++)
        cout << arrs[i] << endl;
    return 0;
}

归并排序

对于归并排序你需要了解

  • 归并排序的空间复杂度?
  • 归并的时间复杂度?
  • 归并排序的实现?
  • 归并排序是否是稳定排序?

归并排序运用了分治的思想,实现上采用递归的方法。

#include <iostream>
#include <vector>
#include <stack>
#include <map>
#include "header.h"
using namespace std;

int arrs[] = {9,1,2,3,4,6,7,4,8,4,6,3,4 };
int arrLen = sizeof(arrs) / sizeof(arrs[0]);
void mergearray(int a[], int first, int mid, int last, int temp[])
{
    int i = first, j = mid + 1;
    int m = mid,   n = last;
    int k = 0;

    while (i <= m && j <= n)
    {
        if (a[i] <= a[j])
            temp[k++] = a[i++];
        else
            temp[k++] = a[j++];
    }

    while (i <= m)
        temp[k++] = a[i++];

    while (j <= n)
        temp[k++] = a[j++];

    for (i = 0; i < k; i++)
        a[first + i] = temp[i];
}
void mergesort(int a[], int first, int last, int temp[])
{
    if (first < last)
    {
        int mid = (first + last) / 2;
        mergesort(a, first, mid, temp);    //左边有序
        mergesort(a, mid + 1, last, temp); //右边有序
        mergearray(a, first, mid, last, temp); //再将二个有序数列合并
    }
}

bool MergeSort(int a[], int n)
{
    int *p = new int[n];
    if (p == NULL)
        return false;
    mergesort(a, 0, n - 1, p);
    delete[] p;
    return true;
}

int main()
{
    MergeSort(arrs, arrLen );
    for (int i = 0; i < arrLen; i++)
        cout << arrs[i] << endl;
    return 0;
}

堆排序&最大堆

对于堆排序你需要了解

  • 什么是最大堆、最小堆?
  • 堆排序是稳定排序么?为什么?
  • 堆排序的时间复杂度是多少?
  • 堆排序的过程、堆排序如何实现?

 最大堆最常用的操作就是插入、删除、排序。只要了解这几个方面就可以对堆很好的掌握。其中调整堆的实质就是下沉操作。堆排序的过程就是建立最大堆,调整堆的过程。插入过程一般指在最末尾添加,调整堆的过程就是上升操作,将添加的数上升直到最大堆的原则

  • 注意每次调整堆以后,堆的长度有变化,adjustHeap()的len是变化的
#include <iostream>
#include <vector>
#include <stack>
#include <map>
#include "header.h"
using namespace std;

int arrs[] = {9,1,2,3,4,6,7,4,8,4,6,3,4 };
int arrLen = sizeof(arrs) / sizeof(arrs[0]);

//非递归方法
//调整堆过程、实际是一个下沉过程
void adjustHeap1(int * arrs, int p, int len){
    int curParent = arrs[p];
    int child = 2* p + 1;   //左孩子 需要从0开始,左孩子就是2n+1
    while(child < len){     //没有孩子
        if(child+1<len&&arrs[child]<arrs[child+1]){
            child++;    //较大孩子的下标
        }
        if(curParent<arrs[child]){
            arrs[p]=arrs[child];
            //没有将curParent赋值给孩子是因为还要迭代子树,
            //如果其孩子中有大的,会上移,curParent还要继续下移。
            p=child;
            child=2*p+1;
        }
        else
            break;
    }
    arrs[p]=curParent;
}
//调整堆的递归方法
void adjustHeap(int * arrs, int p, int len){
    int left = 2*p+1;
    int right =left+1;
    int largest =p;
    if(left<len&&arrs[left]>arrs[largest]){
        largest = left;
    }
    if(right<len&&arrs[right]>arrs[largest]){
        largest = right;
    }
    if(largest !=p){
        int temp = arrs[p];
        arrs[p] = arrs[largest];
        arrs[largest] = temp;
        adjustHeap(arrs,largest,len);
    }
}

void heapSort(int * arrs, int len){
    //建立堆,从最底层的父节点开始
    //大值上升的过程,一层一层的上升
    //调整堆变成最大堆
    for(int i = arrLen /2 -1; i>=0; i--)
        adjustHeap(arrs, i, arrLen);
    //删除最大点,然后进行下沉
    for(int i = arrLen -1; i>=0; i--){
        int maxEle = arrs[0];
        arrs[0] = arrs[i];
        arrs[i] = maxEle;
        adjustHeap(arrs, 0, i);
    }
}

//最大堆的删除操作、删除根节点
//下沉过程
//返回新的长度
int deleteHeap(int * arrs,int len){
    if(len==0) return 0;
    arrs[0] = arrs[len-1];
    adjustHeap(arrs,0,len-1);
    return len-1;
}


//最大堆的插入操作、插在末尾
//上升过程
//返回新的长度
int insertHeap(int * arrs,int len,int childValue){
    int parent = len/2 -1;
    int child = len;
    while(childValue>arrs[parent]){
        arrs[child] = arrs[parent];
        arrs[parent] = childValue;
        child = parent;
        parent = parent/2-1;
        if(parent<0) break;

    }
    return len+1;
}


int main()
{
    heapSort(arrs, arrLen );
    for (int i = 0; i < arrLen; i++)
        cout << arrs[i] << endl;
    return 0;
}

冒泡排序

public void bubbleSort(int a[],int len){
    for(int i=0;i<len;i++){
        for(int j=0;j<len-1-i;j++){//!!!!
            if(a[j]>a[j+1]){
                int temp = a[j];
                a[j] = a[j+1];
                a[j+1] = temp; 
            }
        }
    }
}

相关文章

  • java实现快速排序、归并排序、希尔排序、基数排序算法...

    快速排序算法 归并排序算法 希尔排序算法 基数排序算法

  • web开发需要知道的几个算法

    算法分类 快速排序算法 深度优先算法 广度优先算法 堆排序算法 归并排序算法

  • 算法学习(1)-排序算法

    八大排序算法九大排序算法再总结[经典排序算法][集锦][直观学习排序算法] 视觉直观感受若干常用排序算法 快速排序...

  • 经典排序算法总结

    经典排序算法集锦 冒泡法 排序算法入门之冒泡排序 排序算法入门之冒泡排序优化

  • 前端算法学习-第一篇

    冒泡排序算法 冒泡排序算法是最慢的排序算法之一,也是最容易实现的排序算法。之所以叫冒泡排序是因为使用这种算法排序时...

  • 七大排序算法之冒泡排序

    七大排序算法之冒泡排序 @(算法笔记)[排序算法, 冒泡排序, C++实现] 冒泡排序介绍 冒泡排序是七大排序算法...

  • 算法-选择排序

    算 法:选择排序算法时间复杂度: 选择排序算法概述 选择排序伪代码 选择排序实现 选择排序算法概述 排序算法有许...

  • 浅谈排序算法

    排序算法有很多种,今天先谈谈一些简单的排序算法。包括桶排序、冒泡排序和快速排序算法。后期总结各种排序算法。 桶排序...

  • 线性排序

    桶排序、计数排序、基数排序 一、线性排序算法介绍 1.线性排序算法包括桶排序、计数排序、基数排序。2.线性排序算法...

  • 算法4:插入排序和选择排序算法的比较

    排序算法列表电梯: 选择排序算法:详见 《算法4》2.1 - 选择排序算法(Selection Sort), Py...

网友评论

      本文标题:排序算法

      本文链接:https://www.haomeiwen.com/subject/tmvmvftx.html