C++知识点 排序

1、冒泡排序

它重复地走访过要排序的元素列,依次比较两个相邻的元素

  • 代码实现
void BubbleSort(int arr[], int n)
{
   for (int i = 0; i < n - 1; i++)   
{
        for (int j = 0; j < n - 1 - i; j++)
    {
      if (arr[j] > arr[j + 1])     
      {
        swap(arr, j + 1, j);
      }
    }
  }
}
void swap(int arr[], int x, int y)
{
  int temp = arr[x];
  arr[x] = arr[y];
  arr[y] = temp;
}

2、选择排序

选择排序(Selection sort)是一种简单直观的排序算法。它的工作原理是:第一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,然后再从剩余的未排序元素中寻找到最小(大)元素,然后放到已排序的序列的末尾。以此类推,直到全部待排序的数据元素的个数为零。

  • 代码实现
void SelectSort(int arr[], int n)
{
  for (int i = 0; i < n - 1; i++)
  {
    for (int j = i + 1; j < n; j++)
    {
      if (arr[i] > arr[j])
      {
        swap(arr, i, j);
      }
    }
  }
}

3、插入排序

插入排序的基本操作就是将一个数据插入到已经排好序的有序数据中,从而得到一个新的、个数加一的有序数据

  • 代码实现
void InsertSort(int arr[], int n)
{
  int tempVal;
  for (int i = 1, j; i < n; i++)
  {
    tempVal = arr[i];
    for (j = i - 1; tempVal < arr[j] && j >= 0; --j)
    {
      arr[j + 1] = arr[j];
    }
    arr[j + 1] = tempVal;
  }
}

4、快速排序

通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列

  • 代码实现
void QuickSort(int arr[], int left, int right)
{
  if (left >= right) return;
  int i = left, j = right;
  while (i < j)
  {
while (i < j&&arr[j] >= arr[left])        
--j;
while (i < j&&arr[i] < arr[left])     
++i;
    if (i < j)
      swap(arr, i, j);
  }
  QuickSort(arr, left, i - 1);
  QuickSort(arr, i + 1, right);
}

5、希尔排序

希尔排序,也称递减增量排序算法,是插入排序的一种更高效的改进版本。但希尔排序是非稳定排序算法。插入排序是将未排序的数字插入到已排序数列中,而希尔排序是将一个已排序的数列插入到另一个已排序的数列中。

  • 代码实现
void ShellSort(int arr[], int n)
{
  int tempVal, j;
  int jump = n >> 2;
  while (jump != 0)
  {
    for (int i = jump; i < n; i++)
    {
      tempVal = arr[i];
      for (j = i - jump; j >= 0 && tempVal < arr[j]; j -= jump)
      {
        arr[j + jump] = arr[j];
      }
      arr[j + jump] = tempVal;
    }
jump = jump >> 1;
  }
}

6、桶(基数)排序

桶排序是典型的空间换时间,在对整数排序中,没有什么算法能比它还快,但是在空间浪费上,它是祖宗。

  • 代码实现
void ShellSort(int arr[], int n)
{
  int tempVal, j;
  int jump = n >> 2;
  while (jump != 0)
  {
    for (int i = jump; i < n; i++)
    {
      tempVal = arr[i];
      for (j = i - jump; j >= 0 && tempVal < arr[j]; j -= jump)
      {
        arr[j + jump] = arr[j];
      }
      arr[j + jump] = tempVal;
    }
jump = jump >> 1;
  }
}


累死我了,在word里打了好久。我看好像完整的排序种类有十种,但关键是我不会其他的那什么排序啊QWQ,背过排序一时香,多背算法一直香。(其实我觉得STL里sort也挺香的,关键不知道让不让用...)

原文地址:https://www.cnblogs.com/Jiangxingchen/p/12456200.html