排序算法

2018-08-04  本文已影响8人  稀饭粥95

快速排序

对于快速排序需要了解

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

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

#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; 
            }
        }
    }
}

上一篇下一篇

猜你喜欢

热点阅读