按三种不同的内排序算法对下列数据完成排序:43, 4, 79, 22。
(1)插入法排序,要求写出每次插入一个数据后的数据排列状态;
(2)简单选择法排序,要求写出每次选择一个元素并安置到合适位置后的数据排列状态;
(3)冒泡法排序,要求写出每个轮次的数据排列结果。
#include"stdio.h"
void displayArray(int*a,int n){
int i;
for(i=0;i<n;i++){
printf("%d ",a[i]);
}
printf("\n");
}
// 直接插入排序:默认排序结果是非递减有序序列
void directInsertSort(int*a,int length){
int tmp,i, j;
displayArray(a,length);
for(i=1;i<length;i++){
if(a[i]<a[i-1]){
tmp=a[i];
for(j=i-1;j>=0&&a[j]>tmp;j--){
a[j+1]=a[j];
}
a[j+1]=tmp;
}
displayArray(a,length);
}
}
int main(){
int a[]={43,4,79,22};
directInsertSort(a,sizeof(a)/sizeof(int));
int i,len=sizeof(a)/sizeof(int);
printf("Result:\n");
for(i=0;i<len;i++){
printf("%d ",a[i]);
}
}
#include"stdio.h"
void displayArray(int*a,int n){
int i;
for(i=0;i<n;i++){
printf("%d ",a[i]);
}
printf("\n");
}
void swap(int*a,int*b){(*a)^=(*b);(*b)^=(*a);(*a)^=(*b);}
void selectSort(int a[],int len){
int minpos=0,i,j;
displayArray(a,len);
for(i=0;i<len-1;i++){
minpos=i;
for(j=i+1;j<len;j++){
if(a[j]<a[minpos]) minpos=j;
}
if(minpos!=i){
swap(&a[i],&a[minpos]);
}
displayArray(a,len);
}
}
int main(){
int a[]={43,4,79,22};
int len = sizeof(a)/sizeof(int);
selectSort(a,len);
int i;
printf("Result:\n");
for(i=0;i<len;i++){
printf("%d ",a[i]);
}
}
#include"stdio.h"
void displayArray(int*a,int n){
int i;
for(i=0;i<n;i++){
printf("%d ",a[i]);
}
printf("\n");
}
void swap(int*a,int*b){ (*a)^=(*b);(*b)^=(*a);(*a)^=(*b);}
//线性排序的冒泡排序:递增序列
void bubbleSort(int a[],int len){
int flag;
displayArray(a,len);
for(int i=len-1;i>0;i--) {
flag=0;
for(int j=0;j<i;j++){
if(a[j]>a[j+1]){//将大的后移
flag=1;
swap(&a[j],&a[j+1]);
}
}
if(!flag) break;
displayArray(a,len);
}
}
int main(){
int a[]={43,4,79,22};
int len = sizeof(a)/sizeof(int);
bubbleSort(a,len);
printf("Result:\n");
for(int i=0;i<len;i++){
printf("%d ",a[i]);
}
}
//一维数组解法
#include<stdio.h>
#define MAX_M 12880 //最大限重
#define MAX_N 3402 // 最大种类数
#define max(a,b) a>b?a:b
int dp[MAX_M + 1]={0};
int weights[MAX_N + 1];
int values[MAX_N + 1];
int main() {
int n, m, i, j;
scanf("%d%d", &n , &m);//n是种类,m是限制重量
for (i = 1; i <= n; i++) {
scanf("%d%d", &weights[i] ,&values[i]);
}
for (i = 1; i <= n; i++) {
for (j = m; j >= weights[i]; j--) {
dp[j] = max(dp[j], dp[j - weights[i]] + values[i]);
}
}
printf("%d\n", dp[m] );
}
/*
5 15
4 12
2 2
2 1
1 1
10 4
*/
#include <stdio.h>
#include <stdlib.h>
//打印输出
void show(int *a,int N) {
for (int i = 0; i < N; i++) {
printf("%d\t", a[i]);
}
printf("\n");
}
void bubble_sort(int *a,int len) {
printf("**********冒泡排序**********\n");
int temp, i, j;
for (i = 0; i < len-1; i++) {
for (j = 0; j < len - i - 1; j++)
if (a[j] > a[j + 1]) {
temp = a[j + 1];
a[j + 1] = a[j];
a[j] = temp;
}
show(a,len);
}
}
void select_sort(int *a,int len) {
printf("**********选择排序**********\n");
int temp, i, j,index;
for(i=0; i<len-1; i++) {
index=i;
for(j=i+1; j<len; j++)
if(a[j]<a[index])
index=j;//index存放最小值所在的下标
temp=a[index];//最小元素与下标为k的元素交换
a[index]=a[i];
a[i]=temp;
show(a,len);
}
}
void insert_sort(int *a,int len) {
printf("**********插入排序**********\n");
int i,j,temp;
for (i=1; i<len; i++) {
temp=a[i];
//前一个数大于当前数则交换位置
for (j = i; j > 0 && a[j-1]>temp; j--) {
a[j]=a[j-1];
}
a[j]=temp;
show(a,len);
}
}
int main() {
//冒泡排序
int arr1[]= {43, 4, 79, 22};
int len1=sizeof(arr1)/sizeof(int);
bubble_sort(arr1,len1);
//选择排序
int arr2[]= {43, 4, 79, 22};
int len2=sizeof(arr2)/sizeof(int);
select_sort(arr2,len2);
//插入排序
int arr3[]= {43, 4, 79, 22};
int len3=sizeof(arr3)/sizeof(int);
insert_sort(arr3,len3);
return 0;
}