排序方法
1,直接插入排序
2,希尔排序
3,快速排序
4,简单选择排序
5,堆排序
1,直接插入排序
直接插入排序是一种最简单的排序方法,它的基本操作是将一个记录插入到已经排好序的有序表中,从而得到一个新的且记录数增加了1的有序表。
输入
输入的第一行包含1个正整数n,表示共有n个整数需要参与排序。其中n不超过1000。
第二行包含n个用空格隔开的正整数,表示n个需要排序的整数。
输出
只有1行,包含n个整数,表示从小到大排序完毕的所有整数。
请在每个整数后输出一个空格,并请注意行尾输出换行。
#include <iostream>
using namespace std;
int main()
{
int i,j,m;
cin>>m;
int a[m+1];
for(i=1;i<=m;i++)
{
cin>>a[i];
}
for(i=2;i<=m;i++)
{
if(a[i]<a[i-1])
{
a[0]=a[i];
for(j=i-1;a[0]<a[j];j--)
{
a[j+1]=a[j];
}
a[j+1]=a[0];
}
}
for(i=1;i<=m;i++)cout<<a[i]<<" ";
return 0;
}
样例输入 Copy
10 2 8 4 6 1 10 7 3 5 9
样例输出 Copy
1 2 3 4 5 6 7 8 9 10
2,希尔排序
希尔排序又称“缩小增量排序”,它是一种属于插入排序类的排序方法,但是在时间效率方面较普通的插入排序方法有较大的改进。
希尔排序的基本思想是:先将整个待排序的序列分割成为若干子序列,并分别进行直接插入排序,当整个序列中的记录基本有序时,再对全体记录进行一次直接插入排序。
输入
输入的第一行包含1个正整数n,表示共有n个整数需要参与排序。其中n不超过1000。
第二行包含n个用空格隔开的正整数,表示n个需要排序的整数。
输出
只有1行,包含n个整数,表示从小到大排序完毕的所有整数。
请在每个整数后输出一个空格,并请注意行尾输出换行。
#include <iostream>
using namespace std;
int main()
{
int i,j,k,m,dk[3]={1,3,5};
cin>>m;
int a[m+1];
for(i=1;i<=m;i++)
{
cin>>a[i];
}
for(k=0;k<3;k++)
{
for(i=dk[k]+1;i<=m;i++)
{
if(a[i]<a[i-dk[k]])
{
a[0]=a[i];
for(j=i-dk[k];a[0]<a[j];j-=dk[k])
{
a[j+dk[k]]=a[j];
}
a[j+dk[k]]=a[0];
}
}
}
for(i=1;i<=m;i++)cout<<a[i]<<" ";
return 0;
}
样例输入 Copy
10 2 8 4 6 1 10 7 3 5 9
样例输出 Copy
1 2 3 4 5 6 7 8 9 10
3,快速排序
快速排序是对起泡排序的一种改进。它的基本思想是,通过一趟排序将待排序的记录分割成两个独立的部分,其中一部分记录的关键字均比另一部分的关键字小,在分成两个部分之后则可以分别对这两个部分继续进行排序,从而使整个序列有序。
输入
输入的第一行包含1个正整数n,表示共有n个整数需要参与排序。其中n不超过100000。
第二行包含n个用空格隔开的正整数,表示n个需要排序的整数。
输出
只有1行,包含n个整数,表示从小到大排序完毕的所有整数。
请在每个整数后输出一个空格,并请注意行尾输出换行。
#include <iostream>
using namespace std;
int Partition(int a[],int low,int high)
{
int key;
a[0]=a[low];
key=a[low];
while(low<high)
{
while(low<high&&a[high]>=key)high--;
a[low]=a[high];
while(low<high&&a[low]<=key)low++;
a[high]=a[low];
}
a[low]=a[0];
return low;
}
void Qsort(int a[],int low,int high)
{
int loc;
if(low<high)
{
loc=Partition(a,low,high);
Qsort(a,low,loc-1);
Qsort(a,loc+1,high);
}
}
int main()
{
int i,m;
cin>>m;
int a[m+1];
for(i=1;i<=m;i++)
{
cin>>a[i];
}
Qsort(a,1,m);
for(i=1;i<=m;i++)cout<<a[i]<<" ";
return 0;
}
样例输入 Copy
10 2 8 4 6 1 10 7 3 5 9
样例输出 Copy
1 2 3 4 5 6 7 8 9 10
4,简单选择排序
选择排序的基本思想是:每一趟比较过程中,在n-i+1(i=1,2,...,n-1)个记录中选取关键字最小的记录作为有序序列中的第i个记录。
在多种选择排序中,最常用且形式最为简单的是简单选择排序。
输入
输入的第一行包含1个正整数n,表示共有n个整数需要参与排序。其中n不超过1000。
第二行包含n个用空格隔开的正整数,表示n个需要排序的整数。
输出
只有1行,包含n个整数,表示从小到大排序完毕的所有整数。
请在每个整数后输出一个空格,并请注意行尾输出换行。
#include <iostream>
using namespace std;
int main()
{
int i,j,m,index,temp;
cin>>m;
int a[m+1];
for(i=1;i<=m;i++)
{
cin>>a[i];
}
for(i=1;i<m;i++)
{
index=i;
for(j=i+1;j<=m;j++)
{
if(a[j]<a[index])
{
index=j;
}
}
if(index!=i)
{
temp=a[i];
a[i]=a[index];
a[index]=temp;
}
}
for(i=1;i<=m;i++)cout<<a[i]<<" ";
return 0;
}
样例输入 Copy
10 2 8 4 6 1 10 7 3 5 9
样例输出 Copy
1 2 3 4 5 6 7 8 9 10
5,堆排序
堆排序是一种利用堆结构进行排序的方法,它只需要一个记录大小的辅助空间,每个待排序的记录仅需要占用一个存储空间。
首先建立小根堆或大根堆,然后通过利用堆的性质即堆顶的元素是最小或最大值,从而依次得出每一个元素的位置。
输入
输入的第一行包含1个正整数n,表示共有n个整数需要参与排序。其中n不超过100000。
第二行包含n个用空格隔开的正整数,表示n个需要排序的整数。
输出
只有1行,包含n个整数,表示从小到大排序完毕的所有整数。
请在每个整数后输出一个空格,并请注意行尾输出换行。
#include <iostream>
using namespace std;
void Heapjust(int a[],int s,int m)
{
int j,temp;
temp=a[s];
for(j=2*s;j<=m;j*=2)
{
if(j<m&&a[j]<a[j+1])j++;
if(temp>=a[j])break;
a[s]=a[j];
s=j;
}
a[s]=temp;
}
void HeapSort(int a[],int m)
{
int i;
int temp;
for(i=m/2;i>0;i--)
Heapjust(a,i,m);
for(i=m;i>1;i--)
{
temp=a[i];
a[i]=a[1];
a[1]=temp;
Heapjust(a,1,i-1);
}
}
int main()
{
int i,m;
cin>>m;
int a[m+1];
for(i=1;i<=m;i++)
{
cin>>a[i];
}
HeapSort(a,m);
for(i=1;i<=m;i++)cout<<a[i]<<" ";
return 0;
}
样例输入 Copy
10 2 8 4 6 1 10 7 3 5 9
样例输出 Copy
1 2 3 4 5 6 7 8 9 10