#pragma once
#include<iostream>
using namespace std;
//插入排序:时间复杂度:O(lg(N^2)) 空间复杂度:O(1)
//思路:将第i个元素插入到i-1个已排好序的数组中
void InsertSort(int array[], int size)
{
int i = 0;
int key = 0;//表示待插入位置的元素
int end = 0;//表示第i-1个已排好序的最后一个元素
for (i = 1; i < size; ++i)
{
end = i - 1;
key = array[i];
while (key < array[end]&&end >= 0)
{
array[end + 1] = array[end];
end--;
}
array[end+1] = key;
}
}
//折半查找法 对i-1个元素进行折半查找,找到第i各元素将要插入的位置
//时间复杂度为O(N^2)查找复杂度为O(nlog2(n)
void BinSort(int array[], int size)
{
int i = 0;
int low = 0;
int high = 0;
int mid = 0;
int key = 0;
for (i = 1; i < size; ++i)
{
key = array[i];
low = 0;
high = i - 1;
while (low <= high)
{
mid = low + ((high - low) >> 2);
if (key < array[mid])
high = mid - 1;
else
low = mid + 1;
}
//搬移元素
for (int j = i; j > low; --j)
array[j] = array[j - 1];
array[low] = key;
}
}
//希尔排序
//思路:1、先将N个元素划分成多个子序列,先对多个子序列进行插入排序,让整个序列接近有序
// 2、划分的序列逐渐减小,直到子序列的个数为一,此时序列才是有序的
//时间复杂度:O(n^1.5) 空间复杂度:O(1) 不稳定
void ShellSort(int array[], int size)
{
int gap = size;
int i = 0;
int key = 0;//表示待插入位置的元素
int end = 0;//表示第i-1个已排好序的最后一个元素
while (gap>1)
{
gap = gap / 3 + 1;
for (i = gap; i < size; ++i)
{
end = i - gap;
key = array[i];
while (key < array[end] && end >= 0)
{
array[end + gap] = array[end];
end -= gap;
}
array[end + gap] = key;
}
}
}
//简单选择排序
//每一次找到最大元素的下标,然后将最大元素与最后一个元素进行替换
//时间复杂度:O(n^2) 空间复杂度为O(1)
void SelectSort(int array[], int size)
{
for (int i = 0; i < size-1; ++i)
{
int Maxpos = 0;
for (int j = 1; j < size - i; ++j)
{
if (array[Maxpos]<array[j])//找最大的元素的下标
Maxpos = j;
}
if (Maxpos!=size-i-1)
swap(array[Maxpos], array[size - i - 1]);
}
}
//选择排序的优化:一趟遍历过程中同时寻找最大和最小元素
//然后将最小的放在begin位置,最大的放在end的位置
//时间复杂度:O(n^2)
//空间复杂度:O(1)
void SelectSort1(int array[], int size)
{
int begin = 0, end = size - 1;
while (begin < end)
{
int Maxpos = begin;
int Minpos = begin;
int j = begin + 1;
while (j <= end)
{
if (array[Maxpos]<array[j])//找最大的元素的下标
Maxpos = j;
if (array[j] < array[Minpos])//找最小的元素的下标
Minpos = j;
j++;
}
if (Maxpos != end)
swap(array[Maxpos], array[end]);
if (Minpos == end)
Minpos = Maxpos;
if (Minpos != begin)
swap(array[Minpos], array[begin]);
begin++;
end--;
}
}
//堆排序 大堆
//时间复杂度 O(nlog(n)) 空间复杂度O(1)
void HeapAdjust(int array[], int size, int parent)//大堆 向下调整
{
//默认左孩子比右孩子大
int child = parent * 2 + 1;
while (child < size)
{
//找左右孩子最大的元素
if (child+1 < size && array[child + 1] > array[child])//右孩子大于左孩子
child += 1;
//用最大的孩子和其双亲进行比较
if (array[parent] < array[child])
{
swap(array[parent], array[child]);
parent = child;
child = parent * 2 + 1;
}
else
return;
}
}
void HeapSort(int array[], int size)
{
//创建堆 升序---大堆
int root = (size - 2) >> 1;
for (; root >= 0; --root)
HeapAdjust(array, size, root);
//排序:从最后一个元素一次与根节点的元素交换
int end = size - 1;
while (end>0)
{
swap(array[0], array[end]);
HeapAdjust(array, end, 0);
--end;
}
}
//冒泡排序
//思路:每一趟,两个相邻的元素进行比较,将最大的元素放在最后
//时间复杂度:O(n^2)
//空间复杂度:O(1)
void BubbleSort(int array[], int size)
{
for (int i = 0; i < size-1; ++i)
{
int flag = 0;
for (int j = 0; j < size - 1 - i; ++j)
{
if (array[j]>array[j + 1])
{
swap(array[j], array[j + 1]);
flag = 1;
}
}
if (flag == 0)
break;
}
}
//方法一
//快速排序:先找一个基准值,将比基准值小的元素放在基准值前面
//比基准值大的元素,放在基准值后面,然后返回基准值的下标,利用递归分别对基准值两遍的元素进行排序
//时间复杂度:O(nlog(n)) 空间复杂度:空间复杂度:辅助空间*调用次数O(logN)
int Pation(int array[], int left, int right)
{
int begin = left,end = right-1;
int key = array[end];
while (begin<end)
{
while (begin < end&&array[begin] <= key)
begin++;
while (begin < end&&array[end] >= key)
end--;
if (begin<end)
swap(array[begin], array[end]);
}
if (begin<right - 1)
swap(array[begin], array[right-1]);
return begin;
}
//快速排序
void QuickSort(int array[], int left,int right)
{
if (right - left > 1)
{
int div = Pation(array, left, right);
QuickSort(array, left, div);
QuickSort(array, div + 1, right);
}
}
//方法二
//快速排序:挖坑法
//时间复杂度:O(nlog(n)) 空间复杂度:空间复杂度:辅助空间*调用次数O(logN)
int Pation1(int array[], int left, int right)
{
int begin = left, end = right - 1;
int key = array[end];
while (begin<end)
{
while (begin < end&&array[begin] <= key)
begin++;
if (begin < end)
{
array[end] = array[begin];
end--;
}
while (begin<end&&array[end]>=key)
end--;
if (begin < end)
{
array[begin] = array[end];
begin++;
}
}
array[begin] = key;
return begin;
}
//快速排序
void QuickSort1(int array[], int left, int right)
{
if (right - left > 1)
{
int div = Pation1(array, left, right);
QuickSort1(array, left, div);
QuickSort1(array, div + 1, right);
}
}
//方法三 前后指针
//快速排序:
//时间复杂度:O(nlogn) 空间复杂度:辅助空间*调用次数O(logN)
int Pation2(int array[], int left, int right)
{
int last = left-1, fast = left;
int key = array[right-1];
while (fast < right)
{
if (array[fast] < key&&++last != fast)
{
swap(array[fast], array[last]);
}
fast++;
}
last++;
if (last != right)
swap(array[last], array[right - 1]);
return last;
}
//快速排序
void QuickSort2(int array[], int left, int right)
{
if (right - left > 1)
{
int div = Pation2(array, left, right);
QuickSort2(array, left, div);
QuickSort2(array, div + 1, right);
}
}
C++实现排序算法
最新推荐文章于 2025-07-08 15:45:50 发布