经过前面的两关,我们就来到了C++的第三关啦——学习剩下三种排序咯!
那么我们先看第三种排序——插入排序。
插入排序就是将输入的那组数字分为已排序和未排序两部分,将未排序的数字一个一个插入已排序的数字中,直到未排序的数字为零,此时排序结束。
以下是插入排序代码:
#include<bits/stdc++.h>
using namespace std;
int a[10005];
int main(){
int n,i,j,k,temp;
cin>>n;
for(int i=1;i<=n;i++){
cin>>a[i];
}
for(int i=1;i<=n;i++){
for(j=i-1;j>=1;j--){
if(a[j]<a[i]) break;
}
if(j!=i-1){
temp=a[i];
for(k=i-1;k>j;k--){
a[k+1]=a[k];
}
a[k+1]=temp;
}
}
for(i=1;i<=n;i++){
cout<<a[i]<<" ";
}
return 0;
}
介绍完插入排序接下来我们就来介绍一下计数排序,计数排序与前面几种排序的不同之处就是计数排序对数字进行排序并非是通过对数字大小的比较来进行排序的,而是通过对元素的计数的来实现的。我们会先开一个计数器,然后对所有元素进行一个计数,最后再对数组进行大小排序,来实现对不同大小数字的计数排序。
以下是计数排序的代码:
#include<bits/stdc++.h>
using namespace std;
int a[10005];
const int k=10001;
int main(){
int n,x;
cin>>n;
for(int i=1;i<=n;i++){
cin>>x;
a[x]++;
}
for(int i=0;i<k;i++){
for(int j=a[i];j>0;j--){
cout<<i<<" ";
}
}
return 0;
}
最后就是五中排序中较为便捷且好用的排序了—快速排序。(这里我们只对其思想进行简单的解释,并不对代码进行完全解释)
当然咯,这个代码也比较长,不过没关系,我们一起来慢慢看。
首先,我们要引入两个指针:low和hight,此处的"low"与"hight"分别指向这组数字的首位和末位,然后选择一个数字作为基准元素(此处选择的是第一个数字)。这时我们的low指针指空,指针指空的指针不移动,所以此时我们看hight指针指向的数字是否小于基准数字,如果这个数字大于基准元素,我们就将hight指针左移。如果小于基准元素,我们将这个数字移到low指针指向的空位上,此时hight指针指空,我们对low指针进行同样的操作。
当low指针与hight指针指向同一位置时,我们插入基准元素,完成排序。
#include<bits/stdc++.h>
using namespace std;
int part(int* r, int low, int hight)
{
int i = low, j = hight, point = r[low];
while (i < j)
{
while (i<j && r[j]>point)
{
j--;
}
if (i < j)
{
swap(r[i++], r[j]);
}
while (i < j && r[i] <= point)
{
i++;
}
if (i < j)
{
swap(r[i], r[j--]);
}
}
return i;
}
void Quicksort(int* r, int low, int hight)
{
int mid;
if (low < hight)
{
mid = part(r, low, hight);
Quicksort(r, low, mid - 1);
Quicksort(r, mid+1, hight);
}
}
int main()
{
int a[10001];
int N;
cout << "请输入要排序的数据的个数: " << endl;
cin >> N;
cout << "请输入要排序的数据: " << endl;
for (int i = 0; i < N; i++)
{
cin >> a[i];
}
cout << endl;
Quicksort(a, 0, N - 1);
cout << "排序后的序列为: " << endl;
for (int i = 0; i < N; i++)
{
cout << a[i] << " ";
}
cout << endl;
return 0;
}
到这里,我们C++的第三关就结束了,让我们敬请期待下一关的到来吧!我们下周见!