shell排序
【问题描述】
输入若干整数,使用shell排序后输出。
【输入形式】
输入的第一行一个整数 n ( 0 < n ≤ 107),表示待排序的数的个数。
接下来的一行,包含 n 个整数,表示待排序的数据。
【输出形式】
输出为一行 n 个数,表示已排序后的数。
【样例输入】
5 5 4 3 2 1
【样例输出】
1 2 3 4 5
# include <iostream>
using namespace std;
void inssort(int *A, int n, int incr)
{
for(int i = incr; i < n; i += incr)
for(int j = i; (j >= incr) && (A[j] < A[j - incr]); j -= incr)
swap(A[j], A[j - incr]);
}
void shellsort(int *A, int n)
{
for (int i=n/2; i>=2; i/=2)
{
for (int j=0; j<i; j++)
{
inssort(&A[j],n-j,i);
}
}
inssort(A,n,1);
}
int main()
{
int n;
scanf("%d", &n);
int *a;
a = new int[n];
for(int i = 0; i < n; i++)
cin >> a[i];
shellsort(a, n);
for(int i = 0; i < n; i++)
cout << a[i] << " ";
cout << endl;
return 0;
}
归并排序
【问题描述】
输入若干整数,使用归并排序后输出。
【输入形式】
输入的第一行一个整数 n ( 0 < n ≤ 107),表示待排序的数的个数。
接下来的一行,包含 n 个整数,表示待排序的数据。
【输出形式】
输出为一行 n 个数,表示已排序后的数。
【样例输入】
5 5 4 3 2 1
【样例输出】
1 2 3 4 5
# include <iostream>
using namespace std;
void mergesort(int *A, int *temp, int left, int right)
{
if(left==right) return;
int mid=(left+right)/2;
mergesort(A,temp,left,mid);
mergesort(A,temp,mid+1,right);
for(int i=left; i<=right; i++)
{
temp[i]=A[i];
}
int i1=left;
int i2=mid+1;
for(int curr=left; curr<=right; curr++)
{
if(i1==mid+1)
A[curr]=temp[i2++];
else if(i2>right)
A[curr]=temp[i1++];
else if(temp[i1]<temp[i2])
A[curr]=temp[i1++];
else A[curr]=temp[i2++];
}
}
int main()
{
int n;
scanf("%d", &n);
int *a, *temp;
a = new int[n];
temp = new int[n];
for(int i = 0; i < n; i++)
cin >> a[i];
mergesort(a, temp, 0, n - 1);
for(int i = 0; i < n; i++)
cout << a[i] << " ";
cout << endl;
return 0;
}
快速排序
【问题描述】
输入若干整数,使用快速排序后输出。
【输入形式】
输入的第一行一个整数 n ( 0 < n ≤ 107),表示待排序的数的个数。
接下来的一行,包含 n 个整数,表示待排序的数据。
【输出形式】
输出为一行 n 个数,表示已排序后的数。
【样例输入】
5 5 4 3 2 1
【样例输出】
1 2 3 4 5
# include <iostream>
using namespace std;
inline int findpivot(int *A, int i, int j)
{
return (i + j) / 2;
}
inline int Partition(int *A, int left, int right, int& pivot)
{
do
{
while(A[++left] < pivot);
while((left < right) && (pivot < A[--right]));
swap(A[left], A[right]);
}
while(left < right);
return left;
}
void qsort(int *A, int left, int right)
{
if(right<=left) return;
int pivotindex=findpivot(A,left,right);
swap(A[pivotindex],A[right]);
int k=Partition(A,left-1,right,A[right]);
swap(A[k],A[right]);
qsort(A,left,k-1);
qsort(A,k+1,right);
}
int main()
{
int n;
scanf("%d", &n);
int *a;
a = new int[n];
for(int i = 0; i < n; i++)
cin >> a[i];
qsort(a, 0, n - 1);
for(int i = 0; i < n; i++)
cout << a[i] << " ";
cout << endl;
return 0;
}