挑战程序设计竞赛 算法和数据结构 第3章 初等排序
来源:互联网 发布:mac python版本 编辑:程序博客网 时间:2024/06/05 18:38
挑战程序设计竞赛 算法和数据结构 第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代码如下:
- 挑战程序设计竞赛 算法和数据结构 第3章 初等排序
- 挑战程序设计竞赛 算法和数据结构 第8章 树
- 挑战程序设计竞赛 算法和数据结构 第12章 图
- 挑战程序设计竞赛 算法和数据结构 第18章 数论
- 初等排序算法总结——《挑战程序设计竞赛》
- 挑战程序设计竞赛 算法和数据结构 第15章 高等图算法
- 挑战程序设计竞赛 算法和数据结构 第2章 算法与复杂度
- 挑战程序设计竞赛 算法和数据结构 第6章 递归和分治法
- 挑战程序设计竞赛 算法和数据结构 第13章 加权图
- 挑战程序设计竞赛 算法和数据结构 第11章 动态规划法
- 挑战程序设计竞赛2 算法和数据结构 读后感
- 挑战程序设计竞赛 数据结构与竞赛笔记插入排序
- 挑战程序设计竞赛2 数据结构与算法学习笔记
- 挑战程序设计竞赛(第2版)
- 挑战程序设计竞赛 1.61 nlogn算法
- 《挑战程序设计竞赛》 扩展欧几里得算法 + SPFA
- 最大流算法模板 挑战程序设计竞赛
- 挑战程序设计竞赛 2.1部分和问题
- 基于Lucene对少量新闻(5000篇左右)应用TFIDF方法进行关键字抽取与建立索引、检索
- 在TensorFlow中对比两大生成模型:VAE与GAN(附测试代码)
- 中小卖家电商节恐惧症:你们剁手,我们割肉 2017-10-27 09:00 稿源:懂懂笔记 0条评论 撤稿纠错 “其实对一部分我们这样的中小卖家来说,造节就是煎熬。” 在某大型电商平台上拥有两家
- 【第1094期】图与例解读Async/Await
- SparkSQL编程指南之Java篇一-入门
- 挑战程序设计竞赛 算法和数据结构 第3章 初等排序
- 前端性能优化的关键时间点,你了解吗?
- python3 json 模块
- 在网吧写代码是怎样一种体验?
- 机器学习基础02-数理统计与参数估计
- Codeforces 742A. Arpa’s hard exam and Mehrdad’s naive cheat
- Java 反射机制详解
- 算法精解_C语言 链表_单链表(接口定义+类型实现)
- HDU1097