插入、希尔、冒泡、快速、选择、堆、归并排序算法和性质

80 篇文章 7 订阅
40 篇文章 2 订阅

一、插入排序

1、直接插入排序
void InsertSort(vector<int> &vec) {
  int length = vec.size();
  if (length < 2) {
    return;
  }
  for (int i = 1; i < length; ++i) {
    if (vec[i-1] <= vec[i]) {
      continue;
    }
    int j = i - 1;
    int tmp = vec[i];
    for (; j > -1 && tmp < vec[j]; --j) {
      vec[j+1] = vec[j];
    }
    vec[j+1] = tmp;
  }
}
2、希尔排序
void ShellSort(vector<int> &vec) {
  int length = vec.size();
  if (length < 2) {
    return;
  }
  for (int dk = length/2; dk > 0; dk /= 2) {
    for (int i = dk; i < len; ++i) {
      if (vec[i-dk] <= vec[i]) {
        continue;
      }
      int tmp = vec[i];
      int j = i - dk;
      for (; j > -1 && tmp < vec[j]; j -= dk) {
        vec[j+dk] = vec[j];
      }
      vec[j+dk] = tmp;
    }
  }
}

二、交换排序

1、冒泡排序
void BubbleSort(vector<int> &vec) {
  int length = vec.size();
  if (length < 2) {
    return;
  }
  for (int i = 0; i < length; ++i) {
    for (int j = length - 1; j > i; --j) {
      if (vec[j] < vec[j-1]) {
        swap(vec[j], vec[j-1]);
      }
    }
  }
}
2、快速排序
int Partition(vector<int> &vec, int low, int high) {
  int pivot = vec[low];
  while (low < high) {
    while (low < high && pivot <= vec[high]) --high;
    vec[low] = vec[high];
    while (low < high && pivot >= vec[low]) ++low;
    vec[high] = vec[low];
  }
  vec[low] = pivot;
  return low;
}

void QuickSort(vector<int> &vec, int low, int high) {
  if (low >= high) {
    return;
  }
  int pivotpos = Partition(vec, low, high);
  QuickSort(vec, low, pivotpos - 1);
  QuickSort(vec, pivotpos + 1, high);
}

三、选择排序

1、简单选择排序
void SelectSort(vector<int> &vec) {
  int length = vec.size();
  if (length < 2) {
    return;
  }
  for (int i = 0; i < length; ++i) {
    int min = vec[i];
    int index = i;
    for (int j = i + 1; j < length; ++j) {
      if (vec[j] >= min) {
        continue;
      }
      min = vec[j];
      index = j;
    }
    swap(vec[i], vec[index]);
  }
}
2、堆排序
void AdjustDown(vector<int> &vec, int k, int len) {
  int cur = vec[k];
  for (int i = 2*k+1; i <= len; i = 2*i+1) {
    if (i < len && vec[i] < vec[i+1]) {
      ++i;
    }
    if (cur >= vec[i]) {
      break;
    } else {
      vec[k] = vec[i];
      k = i;
    }
  }
  vec[k] = cur;
}

void BuildMaxHeap(vector<int> &vec, int len) {
  for (int i = len / 2; i > -1; --i) {
    AjustDown(vec, i, len);
  }
}

void HeapSort(vector<int> &vec) {
  int length = vec.size();
  if (length < 2) {
    return;
  }
  BuildMaxHeap(vec, length - 1);
  for (int i = length-1; i > -1; --i) {
    swap(vec[i], vec[0]);
    AdjustDown(vec, 0, i - 1);
  }
}

四、归并排序

1、二路归并排序
void Merge(vector<int> &vec, int low, int mid, int high) {
  vector<int> tmp_vec = vec;
  int i = low, j = mid + 1, k = low;
  while (i <= mid && j <= high) {
    if (tmp_vec[i] <= tmp_vec[j]) {
      vec[k++] = tmp_vec[i++];
    } else {
      vec[k++] = tmp_vec[j++];
    }
  }
  while (i <= mid) {
    vec[k++] = tmp_vec[i++];
  }
  while (j <= high) {
    vec[k++] = tmp_vec[j++];
  }
}

void MergeSort(vector<int> &vec, int low, int high) {
  if (low >= high) {
    return;
  }
  int mid = (low + high) / 2;
  MergeSort(vec, low, mid);
  MergeSort(vec, mid + 1, high);
  Merge(vec, low, mid, high);
}

五、不同排序算法比较

在这里插入图片描述

在这里插入图片描述

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值