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++ 基本算法 冒泡法、交换法、选择法、实现代码集合

    C++ 基本算法 冒泡法、交换法、选择法 在编程中,基本算法是非常重要的。本文将介绍C++中基本算法的三种实现方式:冒泡排序、交换排序、选择排序,并附上相应的实现代码集合以及示例说明。 冒泡排序 冒泡排序,顾名思义,就像水中的气泡一样,从底部慢慢上升。在排序过程中,每次比较相邻两个元素的大小,如果发现顺序不对,就进行交换,直到所有元素都排列好。冒泡排序的时间…

    算法与数据结构 2023年5月19日
    00
  • JS插入排序简单理解与实现方法分析

    JS插入排序简单理解与实现方法分析 描述 插入排序是一种比较简单的排序方法,它的核心思想是将待排序的元素,依次插入到已经排好序的部分,从而逐渐将整个序列排好。具有较好的稳定性和适用性。 实现思路 插入排序的实现思路: 将第一个元素当做已经排序好的序列 从第二个元素开始遍历整个数组 回溯已经排序好的序列,将当前元素插入到比它大的元素之前 重复2、3步骤直到排序…

    算法与数据结构 2023年5月19日
    00
  • C语言实现冒泡排序算法的示例详解

    C语言实现冒泡排序算法的示例详解 冒泡排序是一种简单但效率较低的排序算法。它重复遍历要排序的数列,每次比较相邻两个元素,如果顺序不对就交换两元素顺序。该算法的时间复杂度为 O(n^2)。 以下是C语言实现冒泡排序的示例代码: #include <stdio.h> int main() { int arr[] = {5, 3, 8, 6, 4}; …

    算法与数据结构 2023年5月19日
    00
  • 前端JavaScript多数元素的算法详解

    前端JavaScript多数元素的算法详解 算法介绍 多数元素在一个数组中出现次数超过一半的元素,因此要找到多数元素,需要考虑其出现次数是否超过了数组长度的一半。本文介绍三种常见的多数元素算法,分别为排序法、哈希表法和摩尔投票法。 排序法 排序法的思路是先对数组进行排序,然后返回数组中间的那个元素即可。由于多数元素出现次数超过了数组长度的一半,因此排序后中间…

    算法与数据结构 2023年5月19日
    00
  • PHP排序算法系列之桶排序详解

    PHP排序算法系列之桶排序详解 什么是桶排序? 桶排序是一种简单的排序算法,通过将待排序数组元素分别放到对应的桶中,然后在桶中对元素进行排序,最后将所有桶中元素合并得到有序的数组。 桶排序的步骤 创建一个数组作为桶,数组大小为待排序数组中的最大值加1,数组中每个元素初始化为0。 遍历待排序数组,将每个元素放到对应的桶中,即桶数组中下标为待排序元素的值的元素加…

    算法与数据结构 2023年5月19日
    00
  • JavaScript实现基础排序算法的示例详解

    JavaScript实现基础排序算法的示例详解 排序算法可以说是计算机科学中最基础的算法之一。而对于前端开发者来说,掌握一些简单的排序算法是很有必要的,因为它们可以帮助我们解决很多实际问题,如搜索结果排序、排名等。在这里,我们将讲解JavaScript如何实现基础排序算法。 冒泡排序 冒泡排序是最简单的排序算法之一。它将数组中的元素两两比较,如果顺序不正确就…

    算法与数据结构 2023年5月19日
    00
  • python KNN算法实现鸢尾花数据集分类

    Python实现KNN算法对鸢尾花数据集进行分类 介绍 KNN(K-Nearest-Neighbor)算法是一种非常常用且简单的分类算法之一。它的基本思想是把未知数据的标签与训练集中最邻近的K个数据的标签相比较,得票最多的标签就是未知数据的标签。本文将介绍如何使用Python实现对鸢尾花数据集进行KNN分类。 步骤 加载数据 首先,我们需要加载鸢尾花数据集。…

    算法与数据结构 2023年5月19日
    00
  • C/C++实现快速排序(两种方式)图文详解

    C/C++实现快速排序(两种方式)图文详解 什么是快速排序 快速排序是一种基于分治策略的排序算法,由C.A.R.Hoare在1962年发明。快速排序的基本思路是:在待排序序列中选择一个元素作为“基准”(pivot),将序列分成两个部分,所有比“基准”小的元素放在一边,所有比“基准”大的元素放在另一边。如此递归下去直到序列有序。 算法流程 快速排序的流程可以简…

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