c++中八大排序算法

c++中八大排序算法

本文介绍的是C++中八大排序算法,分别是冒泡排序、选择排序、插入排序、快速排序、希尔排序、归并排序、堆排序和计数排序。下面将对这八种算法进行详细讲解。

冒泡排序

冒泡排序(Bubble Sort),是一种简单的排序算法。它重复地遍历要排序的列表,比较每对相邻的项,如果它们的顺序错误就把它们交换过来。遍历列表的工作是重复地进行知道没有再需要交换,也就是列表已经排序完成。

冒泡排序的优点是操作简单易实现,缺点是时间复杂度较高,只适合于小规模的数据排序。

下面是C++的冒泡排序代码实现:

void bubbleSort(int arr[], int n){
  for(int i = 0; i < n-1; i++){
    for(int j = 0; j < n-i-1; j++){
      if(arr[j] > arr[j+1]){
        // 交换arr[j]和arr[j+1]
        int tmp = arr[j];
        arr[j] = arr[j+1];
        arr[j+1] = tmp;
      }
    }
  }
}

选择排序

选择排序(Selection Sort)是一种简单直观的排序算法。它每次找到最小值,然后放到待排序数组的起始位置,直到全部数组排序完成。

选择排序和冒泡排序一样,时间复杂度也较高,适合小规模数据排序。

下面是C++的选择排序代码实现:

void selectionSort(int arr[], int n){
  int minIndex;
  for(int i = 0; i < n-1; i++){
    minIndex = i;
    for(int j = i+1; j < n; j++){
      if(arr[j] < arr[minIndex]){
        minIndex = j;
      }
    }
    // 交换arr[i]和arr[minIndex]
    int tmp = arr[i];
    arr[i] = arr[minIndex];
    arr[minIndex] = tmp;
  }
}

插入排序

插入排序(Insertion Sort)每次排一个数组项,以此方式构建最后的排序数组。假设这个算法已经排序了第1,2,...i-1 个元素,新的第i个元素继承自原数组中的第i个元素。然后它向前面扫描,将所有大于它的元素后移一个位置,为它留下正确的位置。

插入排序相较于前两种排序算法,其操作性能会更好一些。

下面是C++的插入排序代码实现:

void insertionSort(int arr[], int n){
  for(int i = 1; i < n; i++){
    int current = arr[i];
    int j = i;
    while(j > 0 && arr[j-1] > current){
      arr[j] = arr[j-1];
      j--;
    }
    arr[j] = current;
  }
}

快速排序

快速排序(Quick Sort)使用分治策略来把一个序列分为两个子序列,根据情况递归地排序每个子序列。具体步骤为: 1.从序列中挑出一个元素,称为"基准"(pivot); 2.重新排列序列,所有元素比基准值小的摆放在基准前面,所有元素比基准值大的摆在基准的后面(相同的可以任意一边)。     这个称为分区 (partition) 算法; 3.递归地(recursively)把小于基准值元素的子序列和大于基准值元素的子序列排序。

快速排序的时间复杂度O(nlogn)通常比其他排序算法的最优时间复杂度还要更快,因此被广泛使用。不足之处在于排序的稳定性,并且在随机数据集上性能表现优秀,在特定的数据集上性能表现较差。

下面是C++的快速排序代码实现:

void quickSort(int arr[], int left, int right){
  int i, j, pivot;
  if(left < right){
    i = left;
    j = right;
    pivot = arr[left];
    while(i < j){
      while(i < j && arr[j] >= pivot) j--;
      if(i < j) arr[i++] = arr[j];
      while(i < j && arr[i] < pivot) i++;
      if(i < j) arr[j--] = arr[i];
    }
    arr[i] = pivot;
    quickSort(arr, left, i-1);
    quickSort(arr, i+1, right);
  }
}

希尔排序

希尔排序(Shell Sort)是由Donald Shell在1959年发明的,也称"缩小增量排序"。希尔排序的主要思想是将原始序列分割成若干子序列,然后对子序列排序,使得原始序列中的任意两个相距较远的元素在子序列中都能够比较到。然后依次缩小增量,继续以上步骤,最后增量为1。

希尔排序的时间复杂度是O(n^1.3),比直接插入排序的时间复杂度O(n^2)优秀,但是并不稳定。

下面是C++的希尔排序代码实现:

void shellSort(int arr[], int n){
  int gap, i, j;
  int tmp;
  for(gap = n/2; gap > 0; gap /= 2){
    for(i = gap; i < n; i++){
      tmp = arr[i];
      for(j = i; j >= gap && arr[j-gap] > tmp; j -= gap){
        arr[j] = arr[j-gap];
      }
      arr[j] = tmp;
    }
  }
}

归并排序

归并排序(Merge Sort)是一种有效的排序算法,采用分治算法的一个典型应用。该算法的实现需要用到递归,在拆分数据的过程中很容易地将其划分为一个一个小的子数组,每个子数组都可以视为已排序好的。

归并排序在操作大数据集合时有很高的效率,能够维持其稳定性。但其缺点在于空间复杂度高。

下面是C++的归并排序代码实现:

void mergeSort(int arr[], int start, int end){
  if(start < end){
    int mid = (start + end) / 2;
    mergeSort(arr, start, mid);
    mergeSort(arr, mid+1, end);
    Merge(arr, start, mid, end);
  }
}

void Merge(int arr[], int start, int mid, int end){
  int i = start;
  int j = mid + 1;
  int k = 0;
  int* tmp = new int[end - start + 1];
  while(i <= mid && j <= end){
    if(arr[i] < arr[j]){
      tmp[k++] = arr[i++];
    }
    else{
      tmp[k++] = arr[j++];
    }
  }
  while(i <= mid){
    tmp[k++] = arr[i++];
  }
  while(j <= end){
    tmp[k++] = arr[j++];
  }
  for(int l = 0; l < k; l++){
    arr[start+l] = tmp[l];
  }
  delete[] tmp;
}

堆排序

堆排序(Heap Sort)是一种树形选择排序,是一种改良的选择排序。可以利用数组的特点快速定位指定序列中的最大值(或最小值)。堆排序分为两个过程,建立堆和排序两个过程。建立堆的时间复杂度是O(n),排序的时间复杂度是O(nlogn),堆排序是一种不稳定的排序方法。

下面是C++的堆排序代码实现:

void heapSort(int arr[], int n){
  for(int i = n/2-1; i >= 0; i--){
    adjustHeap(arr, i, n);
  }
  for(int i = n-1; i >= 1; i--){
    swap(arr[0], arr[i]);
    adjustHeap(arr, 0, i);
  }
}

void adjustHeap(int arr[], int i, int len){
  int tmp = arr[i];
  for(int k = i*2+1; k < len; k = k*2+1){
    if(k+1 < len && arr[k] < arr[k+1]) k++;
    if(arr[k] > tmp){
      arr[i] = arr[k];
      i = k;
    }
    else{
      break;
    }
  }
  arr[i] = tmp;
}

计数排序

计数排序(Counting Sort)是一种非比较排序算法,通过对每个元素出现的次数进行计数统计,根据统计结果来进行排序。计数排序的时间复杂度为O(n),非常高效,但是需要耗费额外的内存空间来存储计数器。

下面是C++的计数排序代码实现:

void countingSort(int arr[], int len){
  int minVal = arr[0];
  int maxVal = arr[0];
  for(int i = 1; i < len; i++){
    if(arr[i] < minVal) minVal = arr[i];
    if(arr[i] > maxVal) maxVal = arr[i];
  }
  int cntLen = maxVal - minVal + 1;
  int* cntArr = new int[cntLen];
  memset(cntArr, 0, sizeof(int)*cntLen);
  for(int i = 0; i < len; i++){
    cntArr[arr[i] - minVal]++;
  }
  int index = 0;
  for(int i = 0; i < cntLen; i++){
    while(cntArr[i] > 0){
      arr[index] = i + minVal;
      cntArr[i]--;
      index++;
    }
  }
  delete[] cntArr;
}

至此,C++中的八大排序算法就讲解完毕。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:c++中八大排序算法 - Python技术站

(0)
上一篇 2023年5月19日
下一篇 2023年5月19日

相关文章

  • C++STL函数和排序算法的快排以及归并排序详解

    C++ STL函数和排序算法的快排以及归并排序详解 1. 什么是STL? STL(Standard Template Library)是C++标准库中的一部分,它是由若干个模板类和函数构成的集合,提供了一些常用的数据结构和算法。 其中,数据结构包括vector(可变长数组)、list(双向链表)等,算法包括sort(排序)、find(查找)等。 2. STL…

    算法与数据结构 2023年5月19日
    00
  • JavaScript数组排序的六种常见算法总结

    JavaScript数组排序的六种常见算法总结 一、排序算法简介 排序算法是计算机学科中最基本的算法之一,也是编程中必须要了解的重要内容。在JavaScript编程中,排序算法的应用非常广泛,尤其是在处理和展现数据方面。 二、排序算法分类 根据不同的排序方式和算法思想, 排序算法可以被分类为以下六类。 冒泡排序 选择排序 插入排序 快速排序 归并排序 希尔排…

    算法与数据结构 2023年5月19日
    00
  • c语言冒泡排序和选择排序的使用代码

    下面是冒泡排序和选择排序的使用代码攻略。 冒泡排序和选择排序的使用代码 在C语言中,冒泡排序和选择排序都是经典的排序算法。本文将分别介绍它们的使用代码,以供参考。 冒泡排序 冒泡排序的基本思路是,相邻的元素两两比较,大的往后移,小的往前移,最终实现升序或降序排列的算法。 下面是一个简单的C语言冒泡排序的代码示例: #include <stdio.h&g…

    算法与数据结构 2023年5月19日
    00
  • PHP冒泡排序算法代码详细解读

    PHP冒泡排序算法代码详细解读 什么是冒泡排序? 冒泡排序是一种简单的排序算法,通过交换相邻元素比较和交换的方式进行排序。该算法会重复遍历待排序的数列,每次比较相邻的两个元素,如果顺序错误就交换位置。重复执行这个过程,直到整个数列有序。 算法实现过程 以下是基于PHP语言实现的冒泡排序代码,对应的注释为算法的实现过程说明。 function bubbleSo…

    算法与数据结构 2023年5月19日
    00
  • C/C++实现三路快速排序算法原理

    C/C++实现三路快速排序算法原理 算法概述 三路快速排序算法是一种优化版本的快速排序算法,能够处理含有大量重复元素的数组,避免了快速排序中大量递归处理相等元素的繁琐工作。 三路快速排序的原理是采用三个指针将数组分成小于、等于和大于三个部分,递归地向下快速排序,最终将整个数组排序。 实现步骤 首先选取数组中的一个元素作为标志物,通常是数组的第一个元素。 定义…

    算法与数据结构 2023年5月19日
    00
  • C++ sort排序之降序、升序使用总结

    C++ sort排序之降序、升序使用总结 介绍 sort函数是C++ STL库提供的一种排序函数,可以快速方便地对数组或容器进行排序。本文将详细介绍sort函数的用法,包括排序方式、自定义比较函数和对容器的排序等内容。 基本用法 sort函数的声明如下: template <class RandomAccessIterator> void sor…

    算法与数据结构 2023年5月19日
    00
  • PHP实现常见排序算法的示例代码

    让我来为你详细讲解“PHP实现常见排序算法的示例代码”的完整攻略。 什么是排序算法 排序算法是计算机科学中的基础算法之一,它将一组对象按照特定的顺序排列。排序算法一般都是以数字为例子,但是排序算法同样适用于字符串、日期、结构体等各种类型的数据。 常见的排序算法 常见的排序算法包括冒泡排序、选择排序、插入排序、快速排序、归并排序等。这里我们将为大家介绍冒泡排序…

    算法与数据结构 2023年5月19日
    00
  • Python利用treap实现双索引的方法

    Python利用treap实现双索引的方法 本文将介绍如何用Python语言实现基于treap的双索引方法来建立文本检索系统。 什么是treap? treap是一种二叉搜索树和堆(heap)的混合体。在treap中,每个节点包含一个键值和一个随机权重值。treap强制节点按照二叉搜索树的顺序排列,同时也保持堆的性质,即每个节点的权重都会小于其子节点的权重。这…

    算法与数据结构 2023年5月19日
    00
合作推广
合作推广
分享本页
返回顶部