#include <iostream>
using namespace std;
//希尔排序
int* newarray = new int[12];
void shell_sort(int a[],int len)
{
int h = 1;
while (h < len / 2)
{
h = 2 * h + 1;
}
while (h >= 1)
{
for (int i = 0; i < len; i++)
{
for (int j = i; j >= h; j = j - h)
{
if (a[j] < a[j - h])
{
int tmp = a[j];
a[j] = a[j - h];
a[j - h] = tmp;
}
else
break;
}
}
h = h / 2;
}
}
void merge(int* a, int lo, int hi)
{
int i = lo;
int p1 = lo;
int mid = lo + (hi - lo) / 2;
int p2 = mid + 1;
while (p1 <= mid && p2 <= hi)
{
if (a[p1] <= a[p2])
{
newarray[i++] = a[p1++];
}
else
newarray[i++] = a[p2++];
}
while (p1 <= mid)
{
newarray[i++] = a[p1++];
}
while (p2 <= hi)
{
newarray[i++] = a[p2++];
}
for (int j = lo; j <= hi; j++)
{
a[j] = newarray[j];
}
}
void merge_sort(int a[], int lo, int hi)
{
if (lo >= hi)
return;
int mid = lo + (hi - lo) / 2;
merge_sort(a, lo, mid);
merge_sort(a, mid + 1, hi);
merge(a, lo, hi);
}
void quick_sort(int a[], int left,int right)
{
if (left >= right)
return;
int i, j, base, temp;
i = left, j = right;
base = a[left]; //取最左边的数为基准数
while (i < j)
{
while (a[j] >= base && i < j)
j--;
while (a[i] <= base && i < j)
i++;
if (i < j)
{
//交换
temp = a[i];
a[i] = a[j];
a[j] = temp;
}
}
//基准数归位
a[left] = a[i];
a[i] = base;
quick_sort(a, left, i-1);//递归左子组
quick_sort(a, i + 1, right);//递归右子组
}
int main()
{
int a[] = { 3,6,1,8,7,9,5,4,2,11,10,0 };
int len = 0;
len = sizeof(a) / sizeof(*a);
cout << "排序前:" << endl;
for (int i = 0; i < len; i++)
{
cout << a[i] << ' ';
}
cout << endl;
//shell_sort(a,len); //希尔排序
//merge_sort(a, 0,11); //归并排序
quick_sort(a,0,11); //快速排序
cout << "排序后:" << endl;
for (int i = 0; i < len; i++)
{
cout << a[i] << ' ';
}
cout << endl;
system("pause");
return 0;
}
C++实现希尔排序、归并排序和快速排序
最新推荐文章于 2024-07-07 22:57:34 发布