十大排序的算法复杂度及稳定性如下:
所有代码实现根据https://www.bilibili.com/video/av41042841动画演示来实现,其实堆排序参考百度百科,所有代码均已简单测试。
#include
#include
#include
using namespace std;
// 冒泡排序
void bubble(int arr[], int len){
for (int i = 0; i < len - 1; i++)
if(arr[i]>arr[i+1])swap(arr[i],arr[i+1]);
}
void bubbleSort(int arr[], int len){
for (int i = len ; i > 1; i--)
bubble(arr, i);
}
// 选择排序
int findMaxIndex(int arr[], int len){
int max = arr[0], index = 0;
for (int i = 1; i < len; i++){
if(arr[i]>max){
max = arr[i];
index = i;
}
}
return index;
}
void selectSort(int arr[], int len){
for (int i = len ; i > 1; i--){
int maxIndex = findMaxIndex(arr, i);
swap(arr[i - 1], arr[maxIndex]);
}
}
// 插入排序
void insertSort(int arr[], int len){
int t_i = 0;// 找到第一个不是升序的索引 如 3 6 7 4 找到4的索引
while (t_i < len && arr[t_i]= len) return;
for (int i = t_i; i < len; i++)
{
int t = i;
while (t > 0 && arr[t - 1] > arr[t])
{
swap(arr[t], arr[t - 1]);
t--;
}
}
}
// 计数排序
void calCountSort(int arr[], int len){
int max = arr[0], min = arr[0];
for (int i = 1; i< len; i++){
if(arr[i] > max) max = arr[i];
if(arr[i] < min) min = arr[i];
}
int t_len = max - min;
int *temp = new int[t_len + 1];
for (int i = 0; i < t_len + 1; i++)
temp[i] = 0;
for (int i = 0; i < len; i++)
temp[arr[i] - min]++;
int newIndex = 0;
for (int i = 0; i <= t_len; i++)
while (temp[i]--)
arr[newIndex++]= i + min;
delete[] temp;
temp = 0;
}
// 基数排序
void radixSort(int arr[], int len){
// index:当前的基数(个、十、百...) max: 数组中最大的数
int index = 1, max = arr[0];
for (int i = 1; i < len; i++)
if(arr[i] > max)max = arr[i];
vector> radix(10,vector());
while(index < max){
for (int i = 0; i < len; i++)
{
int t = arr[i] / index;// 开始先对个位求基数,随后到百位千位...
int yushu = t % 10;//基数就是桶的索引
radix[yushu].push_back(arr[i]);
}
// 每次都对所有数据合并
int newIndex = 0;
for (int i = 0; i < radix.size(); i++)
{
for(auto x : radix[i])
arr[newIndex++] = x;
radix[i].clear();
}
index *= 10;//基数向前增加
}
radix.clear();
}
// 快速排序
int partial(int arr[], int l, int r){
// 以右边为基准, index记录基准的索引,最后和l交换
int p = arr[r], index = r;
while (l < r)
{
while (l= p)r--;
swap(arr[l], arr[r]);
}
swap(arr[index], arr[l]);
return l;
}
void quickSort(int arr[], int l, int r){
if(l >= r)return;
int p = partial(arr, l, r);
quickSort(arr, l, p - 1);
quickSort(arr, p + 1, r);
}
//桶排序
void bucketSort(int arr[], int len){
int max = arr[0], min = arr[0];
for (int i = 1; i < len; i++){
if(maxarr[i])min = arr[i];
}
// 桶的个数 = max /10 - min/10 + 1
int bucketSize = max /10 - min/10 + 1;
vector> buckets(bucketSize + 1, list());
int range = (max - 2 + 1) / bucketSize;//每个桶容纳的数
for (int i = 0; i < len; i++)
{
int index = (arr[i] - min) / range;// 得到待插入桶的索引
if(!buckets[index].size())// 如果桶内没有数据 直接插入
buckets[index].insert(buckets[index].begin(), arr[i]);
else{// 如果桶有数据 找到合适的插入位置 插入
auto begin = buckets[index].begin();
while (*begin < arr[i] && begin != buckets[index].end())begin++;
buckets[index].insert(begin, arr[i]);
}
}
// 把所有桶内的数据提取出来放到原数组
int newIndex = 0;
for (int i = 0; i < buckets.size(); i++)
for(auto x : buckets[i])
arr[newIndex++] = x;
//清空所有桶数据
buckets.clear();
}
// 希尔排序
void shellSort(int arr[], int len){
int gap = len / 2;
while (gap)
{
for (int i = gap; i < len; i++)
{
int j = i,t = arr[j];
while (j - gap >= 0 && arr[j - gap] > t)
{
arr[j] = arr[j - gap];
j -= gap;
}
arr[j] = t;
}
gap /= 2;
}
}
// 归并排序
// 合并两个有序数组
void merge(int arr[], int temp[], int l, int m, int r){
int i = l, j = m + 1, k = l;
while (i <= m && j <= r)
{
if(arr[i] < arr[j])
temp[k++] = arr[i++];
else temp[k++] = arr[j++];
}
while (i <= m)
temp[k++] = arr[i++];
while (j <= r)
temp[k++] = arr[j++];
for (i = l; i <= r; i++)
arr[i] = temp[i];
}
void mergeSort(int arr[], int temp[], int l, int r){
if(l >= r)return;
int mid = l + (r - l) / 2;
mergeSort(arr, temp, l, mid);
mergeSort(arr, temp, mid + 1, r);
merge(arr, temp, l, mid, r);
}
// 堆排序
void maxHeapify(int arr[], int start, int end)
{
//cout< arr[son]){ //如果父节点大於子节点代表调整完毕,直接跳出函数
// cout<<"return"<= 0; i--)// 4 3 2 1 0
maxHeapify(arr, i, len - 1);// maxHeapify(arr, 4, 9)
//先将第一个元素和已经排好的元素前一位做交换,再从新调整(刚调整的元素之前的元素),直到排序完毕
for (int i = len - 1; i > 0; i--)
{
swap(arr[0], arr[i]);
maxHeapify(arr, 0, i - 1);
}
}
int main(){
int arr[10] = {588, 392, 898, 115, 306, 62, 909, 902, 789, 234};
int temp[10] = {0};
mergeSort(arr, temp, 0, 9);
for (int i = 0; i < 10; i++)
{
cout<