挑战程序设计竞赛 算法和数据结构 第3章 初等排序
3.2 插入排序法
ALDS1_1_A:Insertion Sort
原书AC代码:
//ALDS1_1_A:Insertion Sort
//原书代码
#include <stdio.h>
/*按顺序输出数组元素*/
void trace(int A[],int N){
int i;
for(i=0;i<N;i++){
if(i>0)printf(" ");/*在相邻元素之间输出1个空格*/
printf("%d",A[i]);
}
printf("\n");
}
/*插入排序(0起点数组)*/
void insertionSort(int A[],int N){
int j,i,v;
for(i=1;i<N;i++){
v=A[i];
j=i-1;
while(j>=0&&A[j]>v){
A[j+1]=A[j];
j--;
}
A[j+1]=v;
trace(A,N);
}
}
int main(){
int N,i,j;
int A[100];
scanf("%d",&N);
for(i=0;i<N;i++)scanf("%d",&A[i]);
trace(A,N);
insertionSort(A,N);
return 0;
}
根据书上插入排序过程图,编码如下:
//ALDS1_1_A:Insertion Sort
//插入排序的核心,只有比较,移位,没有交换
#include <stdio.h>
int a[110],n;
void print(){
int i;
for(i=1;i<=n;i++){
if(i!=1)printf(" ");
printf("%d",a[i]);
}
printf("\n");
}
int main(){
int i,b,j;
scanf("%d",&n);
for(i=1;i<=n;i++)
scanf("%d",&a[i]);
print();
for(i=2;i<=n;i++){
b=a[i],j=i;
while(j>1&&a[j-1]>b)
a[j]=a[j-1],j--;
a[j]=b;
print();
}
return 0;
}
未仿照上述代码,本人编写的C语言AC代码如下, 仔细想想,下面代码不是插入排序,原因是交换过多:
//ALDS1_1_A:Insertion Sort
//样例通过后,提交AC
#include <stdio.h>
int a[110],n;
void print(){
int i;
for(i=1;i<=n;i++){
if(i!=1)printf(" ");
printf("%d",a[i]);
}
printf("\n");
}
int main(){
int i,j,t;
scanf("%d",&n);
for(i=1;i<=n;i++)
scanf("%d",&a[i]);
print();
for(i=2;i<=n;i++){//自小到大
for(j=i;j>=2;j--)
if(a[j]<a[j-1])t=a[j],a[j]=a[j-1],a[j-1]=t;
else break;
print();
}
return 0;
}
3.3 冒泡排序法
ALDS1_2_A:Bubble Sort
原书AC代码:
//ALDS1_2_A:Bubble Sort
//C++
#include <iostream>
using namespace std;
//使用flag的冒泡排序法
int bubbleSort(int A[],int N){
int sw=0;
bool flag=1;
for(int i=0;flag;i++){
flag=0;
for(int j=N-1;j>=i+1;j--){
if(A[j]<A[j-1]){
//交换相邻元素
swap(A[j],A[j-1]);
flag=1;
sw++;
}
}
}
return sw;
}
int main(){
int A[100],N,sw;
cin>>N;
for(int i=0;i<N;i++)cin>>A[i];
sw=bubbleSort(A,N);
for(int i=0;i<N;i++){
if(i)cout<<" ";
cout<<A[i];
}
cout<<endl;
cout<<sw<<endl;
return 0;
}
对照书本的冒泡排序图,编出以下程序:
//ALDS1_2_A:Bubble Sort
#include <stdio.h>
int a[110];
int main(){
int n,i,j,cnt=0,t;
scanf("%d",&n);
for(i=1;i<=n;i++)
scanf("%d",&a[i]);
for(i=1;i<=n;i++)
for(j=n;j>i;j--)
if(a[j]<a[j-1])t=a[j],a[j]=a[j-1],a[j-1]=t,cnt++;
for(i=1;i<=n;i++){
if(i!=1)printf(" ");
printf("%d",a[i]);
}
printf("\n%d\n",cnt);
return 0;
}
未仿照上述代码,本人编写的C语言代码如下,Wrong Answer:
//ALDS1_2_A:Bubble Sort
#include <stdio.h>
int a[110];
int main(){
int n,i,j,cnt=0,t;
scanf("%d",&n);
for(i=1;i<=n;i++)
scanf("%d",&a[i]);
for(i=1;i<=n;i++)
for(j=i+1;j<=n;j++)
if(a[i]>a[j])t=a[i],a[i]=a[j],a[j]=t,cnt++;
for(i=1;i<=n;i++){
if(i!=1)printf(" ");
printf("%d",a[i]);
}
printf("\n%d\n",cnt);
return 0;
}
3.4 选择排序法
ALDS_1_2_B:Selection Sort
原书AC代码:2017-10-30 21:52
//ALDS_1_2_B:Selection Sort
#include <stdio.h>
/*选择排序法(0起点)*/
int selectionSort(int A[],int N){
int i,j,t,sw=0,minj;
for(i=0;i<N-1;i++){
minj=i;
for(j=i;j<N;j++){
if(A[j]<A[minj])minj=j;
}
t=A[i];A[i]=A[minj];A[minj]=t;
if(i!=minj)sw++;
}
return sw;
}
int main(){
int A[100],N,i,sw;
scanf("%d",&N);
for(i=0;i<N;i++)scanf("%d",&A[i]);
sw=selectionSort(A,N);
for(i=0;i<N;i++){
if(i>0)printf(" ");
printf("%d",A[i]);
}
printf("\n");
printf("%d\n",sw);
return 0;
}
仿照书中选择排序过程图,本人编写的C语言AC代码如下:
//ALDS_1_2_B:Selection Sort
#include <stdio.h>
int a[110];
int main(){
int n,i,j,cnt=0,min,k,t;
scanf("%d",&n);
for(i=1;i<=n;i++)
scanf("%d",&a[i]);
for(i=1;i<=n;i++){
min=999;
for(j=i;j<=n;j++)
if(a[j]<min)
min=a[j],k=j;
if(k!=i)//这个判断很关键
t=a[k],a[k]=a[i],a[i]=t,cnt++;
}
for(i=1;i<=n;i++){
if(i!=1)printf(" ");
printf("%d",a[i]);
}
printf("\n%d\n",cnt);
return 0;
}
3.5 稳定排序
ALDS1_2_C:Stable Sort
原书AC代码:
仿照上述代码,本人编写的C语言AC代码如下:
3.6 希尔排序法
ALDS1_2_D:Shell Sort
原书AC代码:
仿照上述代码,本人编写的C语言AC代码如下: