1. | 希尔排序 【问题描述】给出一组数据,请用希尔排序将其按照从小到大的顺序排列好。 【输入形式】原始数据,以0作为输入的结束;第二行是增量的值,都只有3个。 【输出形式】每一趟增量排序后的结果 【样例输入】 8 3 6 1 68 12 19 3 1 0 5 3 1 【样例输出】 8 3 3 1 68 12 19 6 1 【样例输入】 5 3 9 8 2 4 1 7 10 6 0 4 2 1 【样例输出】 2 3 1 7 5 4 9 8 10 6 |
---|
#include<iostream>
using namespace std;
#define MAX 50
void shell(int a[],int len1,int d1)
{
int i,j;
for(i=d1;i<len1;i++)
{
int temp=a[i];
for(j=i-d1;j>=0&&temp<a[j];j-=d1)
{
a[j+d1]=a[j];
}
a[j+d1]=temp;
}
}
int main()
{
int a[MAX],i,j,temp;
for (i=0;i<MAX;i++)
{
cin >> a[i];
if(a[i]==0)
break;
}
int len1=i;
for(i=0;i<3;i++)
{
int d1;
cin >> d1;
shell(a,len1,d1);
for(j=0;j<len1;j++)
cout << a[j] << " ";
cout << endl;
}
}
2. | 堆排序 【问题描述】请用堆排序的方法对一组数据进行排序,并给出建堆以及每一趟堆排序的结果。 8 3 6 1 68 12 0 【样例输出】 68 8 12 1 3 6 【样例输入】 12 9 26 11 38 52 99 27 66 15 32 0 【样例输出】 99 66 52 27 38 12 26 9 11 15 32 |
---|
#include<iostream>
#include<assert.h>
using namespace std;
#define MAX 50
//堆排序
void AdjustDown(int a[], int n, int root)
{
int parent = root;
int child = parent * 2 + 1;
while (child < n)
{
if (child + 1 < n && a[child + 1] > a[child])
{
++child;
}
if (a[child] > a[parent])
{
swap(a[child], a[parent]);
parent = child;;
child = parent * 2 + 1;
}
else
{
break;
}
}
}
void HeapSort(int a[], int n)
{
assert(a);
int i,j;
int parent = (n - 2) >> 1;
//建堆
for (; parent >= 0; --parent)
{
AdjustDown(a, n, parent);
}
for(j=0;j<n;j++)
{
cout << a[j] << " ";
}
cout << endl;
for (i = n - 1; i > 0; --i)
{
swap(a[0], a[i]);
AdjustDown(a, i, 0);
for(j=0;j<n;j++)
{
cout << a[j] << " ";
}
cout << endl;
}
}
int main()
{
int a[MAX],i;
for(i=0;i<MAX;i++)
{
cin >> a[i];
if(a[i]==0)
break;
}
int len1=i;
HeapSort(a, len1);
}
3. | 快速排序 【问题描述】输入一组数据,以0作为输入的结束,分别采用冒泡排序、选择排序、快速排序的方法,对其进行从小到大的排序,给出排序后的结果。 【输入形式】一组数据,以0作为输入的结束 【输出形式】三种排序后的结果 【样例输入】 9 8 4 5 7 2 10 6 0 2 4 5 6 7 8 9 10 2 4 5 6 7 8 9 10 2 4 5 6 7 8 9 10 |
---|
#include<iostream>
using namespace std;
#define MAX 50
void maopao(int a[],int len1)
{
int i,j,temp;
for(i=0;i<len1;i++)
{
for(j=0;j<i;j++)
{
if(a[i]<a[j])
{
temp=a[i];
a[i]=a[j];
a[j]=temp;
}
}
}
}
void xuanze(int a[],int len1)
{
int i,j,min;
for(i=0;i<len1;i++)
{
min=a[i];
for(j=0;j<len1;j++)
{
if(a[j]<min)
min=a[j];
}
}
}
int Part(int a[], int low, int high)
{
int pivot = a[low];
high = high-1;
while(low < high)
{
while(low < high && a[high] >= pivot)
{
--high; a[low] = a[high];
}
while(low < high && a[low] <= pivot)
{
++low;a[high] = a[low];
} //将比枢轴大的元素移动到右端
}
a[low] = pivot; //枢轴元素存放到最终位置
return low; //返回存放枢轴的最终位置
}
void kuaisu(int a[], int low, int high)
{
int i;
if(low < high)
{
int pos = Part(a,low,high); //划分
kuaisu(a, low, pos-1);
kuaisu(a, pos+1, high);
}
}
int Print(int a[],int len1)
{
int i;
for(i=0;i<len1;i++)
{
cout << a[i] << " ";
}
}
int main()
{
int a[MAX],i;
for(i=0;i<MAX;i++)
{
cin >> a[i];
if(a[i]==0)
break;
}
int len1=i;
//cout << len1;
maopao(a,len1);
Print(a,len1);cout << endl;
xuanze(a,len1);
Print(a,len1);cout << endl;
kuaisu(a,1,len1);
Print(a,len1);
}