#include <iostream>
using namespace std;
/**********直接插入排序****************/
void InsertSort(int *a, int len)
{
for (int i = 0; i != len -1; ++i)//i代表已经排好序的元素下标
{
int tar = a[i+1];
for (int j = i; j >= 0; --j)
{
if (tar < a[j])
a[j + 1] = a[j];
else
{
a[j + 1] = tar;
break;
}
}
}
}
/**********希尔排序******************/
//希尔排序是插入排序的加强版
void ShellSort(int *a, int len)
{
for (int gap = len / 2; gap > 0; gap /= 2)
for (int i = gap; i != len ; ++i)
for (int j = i; j - gap >= 0 && a[j - gap] > a[j]; j -= gap)
swap(a[j], a[j - gap]);
}
/**********最大堆排序****************/
//获取父节点
int Parent(int i)
{
return (i-1)/ 2;
}
//获得左孩子和右孩子节点
int Left(int i)
{
return 2 * i + 1;
}
int Right(int i)
{
return 2 * i + 2;
}
void Filter(int *a, int i, int len)//自上到下梳理一遍路径
{
int left = Left(i);
int right = Right(i);
int largest;
if (left <= len - 1 && a[left] > a[i])//寻找最大节点的下标,然后让他和i交换
largest = left;
else
largest = i;
if (right <= len - 1 && a[right] > a[largest])
largest = right;
if (largest != i)
{
swap(a[i], a[largest]);
Filter(a, largest, len);
}
}
void BuildHeap(int *a, int len)
{
for (int i = len / 2; i >= 0; --i)
Filter(a, i, len);
}
void HeapSort(int *a, int len)
{
BuildHeap(a, len);
//cout << len;
for (int i = len -1; i != 0; --i)
{
swap(a[0], a[i]);
len--;
Filter(a, 0, len);
}
}
/**********快速排序****************/
void QuickSortHelp(int e[], int first, int end)
{
int i = first, j = end;
int temp = e[i];
while (i < j)
{
while (e[j]> temp)
j--;
e[i] = e[j];
while (i < j)
i++;
e[j] = e[i];
}
e[i] = temp;
if (i - 1 > first)QuickSortHelp(e, first, i - 1);
if (end > i + 1)QuickSortHelp(e, i + 1, end);
}
void QuickSort(int e[], int len)
{
QuickSortHelp(e, 0, len - 1);
}
/**********冒泡排序****************/
void BubbleSort(int a[], int len)
{
for (int i = 0; i != len - 1; ++i)
{
for (int j = 0; j != len - 1 - i; ++j)
{
if (a[j] > a[j + 1])swap(a[j + 1], a[j]);
}
}
}
/**********归并排序****************/
void MergeHelp(int a[], int start, int mid, int end, int temp[])
{
int tempIndex = 0, i = start, j = mid + 1;
//if (i <= mid && mid + 1 <= end)
{
while (i <= mid && j <= end)
{
if (a[i] > a[j])temp[tempIndex++] = a[i++];
else temp[tempIndex++] = a[j++];
}
while (i <= mid)temp[tempIndex++] = a[i++];
while (j <= end)temp[tempIndex++] = a[j++];
for (int k = 0; k != tempIndex; ++k)
a[start + k] = temp[k];
}
}
void MergeSort(int a[], int start, int end, int temp[])
{
if (start < end)
{
int mid = (start + end) / 2;
MergeSort(a, start, mid, temp);
MergeSort(a, mid + 1, end, temp);
MergeHelp(a, start, mid, end, temp);
}
}
/**********选择排序****************/
int findMin(int a[], int start, int len)
{
int i = start, min = a[i];
if (len > 0)
{
for (int j = start; j != start + len; ++j)
if (a[j] < min){
min = a[j];
i = j;
}
return i;
}
}
void SelectSort(int a[], int len)
{
for (int i = 0; i != len; ++i)
{
int minIndex = findMin(a, i, len - i);
swap(a[minIndex], a[i]);
}
}
int main()
{
int a[] = { 0, 3, 4, 2, 5, 1, 8, 4, 2, 19,7 };
SelectSort(a, 11);
//BuildHeap(a, 11);
for (int i = 0; i != 11; ++i)cout << a[i] << endl;
system("pause");
return 0;
}
各种常见排序函数的C++代码
最新推荐文章于 2022-05-19 20:46:17 发布