简单的做了些题
5-1 排序算法
本题要求完成三种常用排序算法。
输入10个需要排序的序列,用空格隔开以-1结束。输入样例为:
8 9 7 5 3 1 2 4 6 10 -1
输出样例为:
直接插入排序: 1 2 3 4 5 6 7 8 9 10
冒泡排序: 1 2 3 4 5 6 7 8 9 10
简单选择排序: 1 2 3 4 5 6 7 8 9 10
//直接插入排序
void InsertSort(RecordType r[], int length){
for (int i = 2; i <= length; i++) {
if(r[i].key < r[i-1].key) {
r[0] = r[i]; //2 分
r[i] = r[i-1];//2 分
int j=i-2;
for(;r[0].key<r[j].key;j--)
r[j+1]=r[j];
r[j + 1] = r[0];//2 分
} }
Print(r,length);}
//冒泡排序
void BubbleSort(RecordType r[], int length){
for (int i = 1; i <= length; i++) {
for (int j = 1; j <= length - i; j++) {
if (r[j].key > r[j + 1].key) {
r[0] = r[j+1];//2 分
r[j + 1] = r[j];//2 分
r[j] = r[0];//2 分
} } }
Print(r,length);}
//简单选择排序
void SelectSort(RecordType r[], int length){
for (int i = 1; i <= length - 1; i++) {
int k = i;
for (int j = i + 1; j <= length; j++) {
if (r[j].key < r[k].key) {
k = j; } }
if (k != i) {
r[0] = r[i];//2 分
r[i] = r[k];//2 分
r[k] = r[0];//2 分
} }
Print(r,length);}
6-1 快速排序
本题要求实现快速排序的一趟划分函数,待排序列的长度1<=n<=1000。
函数接口定义:
int Partition ( SqList L, int low, int high );
其中L是待排序表,使排序后的数据从小到大排列。
###类型定义:
typedef int KeyType;
typedef struct
{
KeyType *elem; /*elem[0]一般作哨兵或缓冲区*/
int Length;
}SqList;
裁判测试程序样例:
#include<stdio.h>
#include<stdlib.h>
typedef int KeyType;
typedef struct
{
KeyType *elem; /*elem[0]一般作哨兵或缓冲区*/
int Length;
}SqList;
void CreatSqList(SqList *L);/*待排序列建立,由裁判实现,细节不表*/
int Partition ( SqList L,int low, int high );
void Qsort ( SqList L,int low, int high );
int main() {
SqList L;
int i;
CreatSqList(&L);
Qsort(L,1,L.Length);
for(i=1;i<=L.Length;i++)
printf("%d ",L.elem[i]);
return 0;
}
void Qsort ( SqList L,int low, int high )
{
int pivotloc;
if(low<high) {
pivotloc = Partition(L, low, high ) ;
Qsort (L, low, pivotloc-1) ;
Qsort (L, pivotloc+1, high );
}
} /*你的代码将被嵌在这里 */
输入样例:
第一行整数表示参与排序的关键字个数。第二行是关键字值 例如:
10
5 2 4 1 8 9 10 12 3 6
输出样例:
输出由小到大的有序序列,每一个关键字之间由空格隔开,最后一个关键字后有一个空格。
1 2 3 4 5 6 8 9 10 12
int Partition ( SqList L,int low, int high ){
L.elem[0]=L.elem[low];
int pivotkey=L.elem[0];
while(low<high){
while(low<high&&L.elem[high]>=pivotkey) high--;
L.elem[low]=L.elem[high];
while(low<high&&L.elem[low]<=pivotkey) low++;
L.elem[high]=L.elem[low];
}
L.elem[low]=L.elem[0];
return low;
}
7-1 二分查找
对于输入的n个整数,先进行升序排序,然后进行二分查找。
输入格式:
测试数据有多组,处理到文件尾。每组测试数据第一行输入一个整数n(1≤n≤100),第二行输入n个各不相同的待排序的整数,第三行是查询次数m(1≤m≤100),第四行输入m个待查找的整数。
输出格式:
对于每组测试,分2行输出,第一行是排序后的升序的结果,每两个数据之间留一个空格;第二行是查找的结果,若找到则输出排序后元素的位置(从1开始,每两个数据之间留一个空格),否则输出0。
输入样例:
9
4 7 2 1 8 5 9 3 6
5
10 9 8 7 -1
输出样例:
1 2 3 4 5 6 7 8 9
0 9 8 7 0
#include<bits/stdc++.h>
using namespace std;
int main()
{
int n,m;
while(~scanf("%d",&n))
{
int a[110];
map<int,int>mp;
for(int i=1;i<=n;i++)
{
scanf("%d",&a[i]);
}
sort(a+1,a+n+1);
for(int i=1;i<=n;i++)
{
mp[a[i]]=i;
if(i!=1) cout<<' ';
cout<<a[i];
}
printf("\n");
scanf("%d",&m);
int x,f=0;
for(int i=0;i<m;i++)
{
scanf("%d",&x);
if(mp[x]>=1&&mp[x]<=n)
{
if(f++) printf(" ");
printf("%d",mp[x]);
}
else
{
if(f++) printf(" ");
printf("0");
}
}
printf("\n");
}
return 0;
}
7-2 冒泡排序
冒泡排序
,将一个列表中的两个元素进行比较,并将最小的元素交换到顶部。两个元素中较小的会冒到顶部,而较大的会沉到底部,该过程将被重复执行,直到所有元素都被排序。
输入格式:
输入在第1行中给出N(1<N≤100),在第2行中给出N个待排序的整数,数字间以空格分隔,并保证数字没有重复的出现。
输出格式:
给出冒泡排序每一遍后的中间结果数列,数字间以空格分隔,但末尾不得有多余空格。注意:当排序完成时应立即停止
。
输入样例1:
7
4 5 7 6 3 2 1
输出样例1:
4 5 6 3 2 1 7
4 5 3 2 1 6 7
4 3 2 1 5 6 7
3 2 1 4 5 6 7
2 1 3 4 5 6 7
1 2 3 4 5 6 7
输入样例2:
6
1 2 3 6 5 4
输出样例2:
1 2 3 5 4 6
1 2 3 4 5 6
#include<stdio.h>
int main ()
{
int a[10],n,i,j,temp,x,cnt;
bool flag=false;
scanf("%d",&n);
for(i=0;i<n;i++){
scanf("%d",&a[i]);
}
for(i=0;i<n-1;i++){
for(j=0;j<n-i-1;j++){
if(a[j]>a[j+1]){
flag=true;
temp=a[j];
a[j]=a[j+1];
a[j+1]=temp;
}
}
if(!flag){
break;
}else{
flag=false;
for(x=0;x<n;x++){
if(x<n-1){
printf("%d ",a[x]);
}else{
printf("%d\n",a[x]);
}
}
}
}
}