自己实现的排序算法,用来复习
#include <iostream>
using namespace std;
void swap(int &a,int &b)
{
int temp;
temp = a;
a = b;
b = temp;
}
void headp_adjust(int *a,int s,int m)
{
int temp= a[s];
//i =2*i+1表示左边的还在节点
for (int i = 2 * s+1; i <= m; i =2*i+1)
{
if (i < m && a[i] < a[i + 1])
i++;
if (temp < a[i]) //此处必须与temp比较大小,不是a[s],因为此时的a[s]处的值并没有与父节点交换
{
a[s] = a[i];
s = i;
}
else
break;
}
a[s] = temp;
}
void bubble_sort(int *a,int len)
{
int flag = 1;
for (int j = 1; j <= len - 2 && flag; j++)
{
flag = 0;
for (int i = len - 1; i >= j; i--)
{
if (a[i] < a[i - 1])
{
swap(a[i], a[i - 1]);
flag = 1;
}
}
//for (int i = 0; i < len; i++)
//{
// cout << a[i] << " ";
//}
//cout << endl;
}
}
void select_sort(int *a,int len)
{
int min;
for (int i = 0; i < len - 1; i++)
{
min = i;
for (int j = i + 1; j <= len - 1; j++)
{
if (a[min] > a[j])
min = j;
}
if (min != i)
swap(a[i],a[min]);
}
}
void insert_sort(int *a, int len)
{
for (int i = 1; i < len; i++)
{
int temp;
if (a[i] < a[i - 1])
{
temp = a[i];
int j;
for (j = i - 1; j>=0 && a[j] > temp; j--) //加入j>=o的限制,否则会越界
{
a[j + 1] = a[j];
}
a[j + 1] = temp;
}
}
}
void shell_sort1(int *a,int len)
{
for (int d = len / 2; d > 0; d /= 2) //指定增量
{
for (int i = 0; i < len-d; i++) //对各段数据分别用直接插入排序
{
for (int j = d+i; j < len; j += d) //指定插入排序的数据
{
int temp;
if (a[j] < a[j - d])
{
temp = a[j];
int k;
for (k=j-d;k>=0 && a[k]>temp;k -=d)
{
a[k + d] = a[k];
}
a[k+d] = temp;
}
}
}
}
}
void shell_sort2(int *a, int len)
{
for (int d = len / 2; d > 0; d /= 2) //使用希尔增量
{
for (int i = d; i < len; i += 1) //首先处理全部字段的第一个数,再是第二个数
{
int temp;
if (a[i] < a[i - d])
{
temp = a[i];
int j;
for (j = i - d; j >= 0 && a[j] > temp; j -= d)
{
a[j + d] = a[j];
}
a[j + d] = temp;
}
}
}
}
void shellsortHb(int p[], int n)
{
int d, i, j, temp;
/* d = 1, 3, 7, 15, 31 ... 2^i-1 */
for (d = 1; d <= n / 4; d = d * 2 + 1);//产生最大的那个数
for (; d > 0; d = (d - 1) / 2)
{
for (i = d; i < n; i++)
{
temp = p[i];
for (j = i - d; j >= 0 && p[j] > temp; j -= d)
{
p[j + d] = p[j];
}
p[j + d] = temp;
}
}
}
void stack_sort(int *a,int len)
{
for (int i = len/2-1; i >= 0; --i)
{
headp_adjust(a, i, len-1);
//for (int i = 0; i < len; i++)
//{
// cout << a[i] << " ";
//}
//cout << endl;
}
cout << endl;
for (int j=len-1;j>0;j--)
{
swap(a[0],a[j]);
headp_adjust(a, 0, j-1);
//for (int i = 0; i < len; i++)
//{
// cout << a[i] << " ";
//}
//cout << endl;
}
}
//归并排序 递归实现
void merge(int *a,int low,int mid,int high)
{
int *buffer = new int[high-low+1];
int i = low, j = mid + 1, k = 0;
while (i<=mid && j<=high)
{
if (a[i] < a[j])
buffer[k++] = a[i++];
else
buffer[k++] = a[j++];
}
while (i<=mid)
{
buffer[k++] = a[i++];
}
while (j <= high)
{
buffer[k++] = a[j++];
}
for (i = 0; i < high - low + 1; i++)
{
a[low + i] = buffer[i];
}
delete[] buffer;
}
void merge_sort1(int *a, int low, int high)
{
int mid = (low + high) / 2;
if (low < high)
{
merge_sort1(a, low, mid);
merge_sort1(a,mid+1,high);
merge(a,low,mid,high);
}
}
//归并排序非递归实现
//参数和递归略不同,n代表数组中元素个数,即数组最大下标是n-1
void merge_sort2(int *a, int n)
{
int size = 1, low, mid, high;
while (size <= n - 1) //保证右半merge数组至少有一个元素
{
low = 0;
while (low + size <= n - 1)//low + size 表示右半数组的第一个元素下标,即它的下标应该在数组界限内,如果右半部分不存在,则左半部分不做处理
{
mid = low + size - 1;
high = mid + size;
if (high > n - 1)
high = n - 1;
merge(a, low, mid, high);
low = low+2*size;
}
size *= 2;
}
}
int main()
{
int a[10] = {0,50,10,90,30,70,40,80,60,20};
int b[10] = {9,5,4,3,7,1,8,6,0,2};
/*stack_sort(a, 9);*/
/*bubble_sort(a, 9);*/
/*select_sort(a,9);*/
/*insert_sort(a,9);*/
/*shell_sort1(b,10);*/
//ShellSort(a,10);
/*shellsortHb(a,10);*/
/*merge_sort1(b,0,9);*/
merge_sort2(b, 10);
cout << endl;
for (auto s:b)
{
cout << s << " ";
}
return 0;
}