目录
不要使用CV大法,有问题私戳我。
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
1 3 1 8 6 3 19 68 12
1 1 3 3 6 8 12 19 68【样例输入】
5 3 9 8 2 4 1 7 10 6 0
4 2 1
【样例输出】
2 3 1 7 5 4 9 8 10 6
1 3 2 4 5 6 9 7 10 8
1 2 3 4 5 6 7 8 9 10
#include<bits/stdc++.h>
using namespace std;
int a[100],b[10];
int i , j ,k, temp ,len1, len2 , incr ;
void print()
{
for( i = 0 ;i < len1 ; i++)
{
cout<<a[i]<<" ";
}
cout<<endl;
}
void shellsort()
{
for( k = 0 ; k < len2 ; k++)
{
incr = b[ k ];
for( i = incr ; i < len1 ; i++ )
{
temp = a[ i ];
j = i - incr ;
while(j >= 0 && a[j]>temp )
{
a[ j + incr ] = a[ j ];
j-=incr;
}
a[j + incr ] = temp;
}
print();
}
}
int main()
{ len1 = 0 ,len2 = 0 ;
while(1)
{
cin>>a[ len1 ];
if(a[ len1 ] == 0)
break;
len1++;
}
while(len2<3)
{
cin>>b[ len2 ];
len2++;
}
shellsort();
}
2.堆排序
【问题描述】请用堆排序的方法对一组数据进行排序,并给出建堆以及每一趟堆排序的结果。
【输入形式】一组数据,以0作为输入的结束。
【输出形式】建大根堆的结果,以及每一趟堆排序的结果。
【样例输入】8 3 6 1 68 12 0
【样例输出】
68 8 12 1 3 6
12 8 6 1 3 68
8 3 6 1 12 68
6 3 1 8 12 68
3 1 6 8 12 68
1 3 6 8 12 68【样例输入】
12 9 26 11 38 52 99 27 66 15 32 0
【样例输出】
99 66 52 27 38 12 26 9 11 15 32
66 38 52 27 32 12 26 9 11 15 99
52 38 26 27 32 12 15 9 11 66 99
38 32 26 27 11 12 15 9 52 66 99
32 27 26 9 11 12 15 38 52 66 99
27 15 26 9 11 12 32 38 52 66 99
26 15 12 9 11 27 32 38 52 66 99
15 11 12 9 26 27 32 38 52 66 99
12 11 9 15 26 27 32 38 52 66 99
11 9 12 15 26 27 32 38 52 66 99
9 11 12 15 26 27 32 38 52 66 99
#include<bits/stdc++.h>
using namespace std;
void print(int a[],int len)
{
for( int i = 0 ;i < len ; i++)
{
cout<<a[i]<<" ";
}
cout<<endl;
}
void adjustheap(int a[] , int i , int len )
{
int temp = a[ i ];
for(int k = 2 * i + 1;k < len ;k = 2 * k + 1)
{
if( k != len - 1 && a[ k ] < a[k + 1])
{
k++;
}
if(a[ k ]>temp)
{
a[ i ] =a [ k ];
i = k;
}
else break;
}
a[ i ] = temp;
}
void heapsort(int a[] , int len)
{ int i ,j;
if(len < 2)
{ print(a,len);
return ;
}
for(i = len / 2 - 1 ;i >= 0;i-- )
{
adjustheap( a , i ,len );
}
print(a,len);
for( j = len - 1;j > 0;j--)
{
int tmp = a[ 0 ];
a[ 0 ] = a[ j ];
a[ j ] = tmp;
adjustheap( a, 0 ,j );
print(a,len);
}
}
int main()
{
int a[100] ,len = 0;
while(1)
{
cin>>a[ len ];
if(a[ len ] == 0)
{
//cout<<len<<endl;
break;
}
len++;
}
heapsort(a,len);
// print(a,len);
}
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<bits/stdc++.h>
using namespace std;
void print(int a[], int len)
{
for( int i = 0 ;i < len ; i++)
{
cout<<a[i]<<" ";
}
cout<<endl;
}
void bubblesort(int a[],int len)//相邻两个之间进行比较,取最大的元素放到右边
{
int i,j,flag;
for( i = 0 ; i < len - 1 ; i++ )
{
flag = 1;
for( j = 0 ;j <len - 1 - i ; j++)
{
if(a[ j ]> a[ j + 1 ])
{ flag = 0;
int temp = a [ j ];
a[ j ] = a[j + 1 ];
a[j + 1] = temp;
}
}
if(flag == 1)
break;
}
print(a,len);
}
void quicksort(int a[],int begin ,int end)
{
if(begin>end)
return ;
int temp = a[ begin ];
int i = begin;
int j = end;
while( i != j)
{
while(a[ j ] >= temp&& j > i)
j--;
while(a[ i ] <=temp&&j > i)
i++;
if(j > i )
{
int tmp = a[ i ];
a[ i ] = a[ j ];
a[ j ] = tmp;
}
}
a[begin] = a[ i ];
a[ i ] = temp;
quicksort( a ,begin , i - 1 );
quicksort( a, i + 1 , end );
}
void selectsort(int a[],int len)
{
for( int i = 0 ; i < len - 1; i++)
{
int Min = i;
for( int j = i + 1 ;j < len ; j++ )
{
if( a[ Min ] > a[ j ] )
{
Min = j;
}
}
if( Min != i )
{
int temp = a[ Min ];
a[ Min ] = a[ i ] ;
a[ i ] = temp;
}
}
print(a,len);
}
int main()
{ int a[100];
int len = 0;
while(1)
{
cin>>a[ len ];
if(a[ len ] == 0)
break;
len++;
}
bubblesort(a,len);
cout<<endl;
selectsort(a,len);
cout<<endl;
quicksort(a ,0 ,len - 1);
print(a,len);
}
4.排序综合
【题目描述】随机生成10000、20000、40000、80000、160000个整形数据,监测冒泡排序、选择排序、快速排序这三种排序方法各自所需要的时间,并显示其排序时间。可以将前面做过的其他排序方法加入,进行对比。
【说明】此题仅提交、不测评、不计分。
#include <bits/stdc++.h>
#include <time.h>
#define N 10000//随机生成的数据
using namespace std;
clock_t start ,stop ;
double duration ;
void bubblesort(int a[] , int len)//相邻两个之间进行比较,取最大的元素放到右边的冒泡
{
int flag;
for( int i = 0 ; i < len - 1 ; i++ )
{
flag = 1;
for( int j = 0 ;j <len - 1 - i ; j++)
{
if(a[ j ]> a[ j + 1 ])
{ flag = 0;
int temp = a [ j ];
a[ j ] = a[j + 1 ];
a[j + 1] = temp;
}
}
if(flag == 1)
break;
}
}
void selectsort( int a[] ,int len )
{
for( int i = 0 ; i < len - 1; i++)
{
int Min = i;
for( int j = i + 1 ;j < len ; j++ )
{
if( a[ Min ] > a[ j ] )
{
Min = j;
}
}
if( Min != i )
{
int temp = a[ Min ];
a[ Min ] = a[ i ] ;
a[ i ] = temp;
}
}
}
void quicksort(int a[],int begin ,int end)
{
if(begin>end)
return ;
int temp = a[ begin ];
int i = begin;
int j = end;
while( i != j)
{
while(a[ j ] >= temp&& j > i)
j--;
while(a[ i ] <=temp&&j > i)
i++;
if(j > i )
{
int tmp = a[ i ];
a[ i ] = a[ j ];
a[ j ] = tmp;
}
}
a[begin] = a[ i ];
a[ i ] = temp;
quicksort( a ,begin , i - 1 );
quicksort( a, i + 1 , end );
}
int main()
{ int a[N] , i , j ;
for( i = 0 ;i < N ; i++)
{
a[i] = rand() % N;
}
start = clock();
bubblesort( a , N);
stop = clock();
duration = (double)(stop - start )/CLOCKS_PER_SEC;
cout<<"冒泡排序的运行时间是"<<duration<<"秒"<<endl;
for( i = 0 ;i < N ; i++)
{
a[i] = rand() % N;
}
start = clock();
selectsort( a , N);
stop = clock();
duration = (double)(stop - start )/CLOCKS_PER_SEC;
cout<<"选择排序的运行时间是"<<duration<<"秒"<<endl;
for( i = 0 ;i < N ; i++)
{
a[i] = rand() % N;
}
start = clock();
quicksort( a , 0 ,N -1);
stop = clock();
duration = (double)(stop - start )/CLOCKS_PER_SEC;
cout<<"快速排序的运行时间是"<<duration<<"秒"<<endl;
return 0;
}