排序
#include<stdio.h>
int main(){
int a[]={1,4,5,6,8,0,3,4,6,8};
int i,j,n=sizeof(a)/sizeof(int),t;
for(i=0;i<n-1;i++){
for(j=i+1;j<n;j++){
if(a[i]>a[j]){//升序排序
t=a[i];
a[i]=a[j];
a[j]=t;
}
}
}
for(i=0;i<n;i++){
printf("%d ",a[i]);
}
return 0;
}
去重
解法一:
先排序,再去重
#include<stdio.h>
int main(){
int a[]={1,4,5,6,8,8,0,3,4,6,8};
int i,j,n=sizeof(a)/sizeof(int),t;
for(i=0;i<n-1;i++){
for(j=i+1;j<n;j++){
if(a[i]>a[j]){//升序排序
t=a[i];
a[i]=a[j];
a[j]=t;
}
}
}
for(i=1;i<n;i++){
if(a[i]==a[i-1]){
for(j=i;j<n-1;j++){
a[j]=a[j+1];
}
i--;
/*防止下一个数也是重复数字,不做这步的话,
如果下一个元素还是重复元素,但循环退出执行i++,
a[i]在前移的过程中被赋的新值没办法与a[i-1]比较; */
n--;
/*去掉此处重复数字后数组的元素个数减一,
此时第n个元素已经不再是考虑的范围了,
所以不用再写个t保证i从0到n了。*/
}
}
for(i=0;i<n;i++){
printf("%d ",a[i]);
}
return 0;
}
解法二:
用元素 a[i] 记录下标 i 出现的次数
//用于对元素个数较多而元素取值范围不大的数组去重;
#include<stdio.h>
#define N 101//元素取值范围0~100
int main(){
int a[]={1,4,5,6,8,0,3,4,6,8};
int b[N]={0};
int i,j,n=sizeof(a)/sizeof(int),t=0;
for(i=0;i<n;i++){
b[a[i]]++;
}
//b数组用下标代表a数组元素,b的元素值记录出现的次数;
for(i=0,j=0;i<N;i++){
if(b[i]!=0){
//如果b元素不等于0,说明b的下标即a中存在的元素;
a[j]=i;
j++;
}
}
for(i=0;i<j;i++){
printf("%d ",a[i]);
}
return 0;
}
解法三:
枚举去重
#include<stdio.h>
int main(){
int a[]={1,4,5,6,8,0,3,4,6,8};
int i,j,n=sizeof(a)/sizeof(int),k=0;
for(i=0;i<n-1;i++){
for(j=i+1;j<n;j++){
if(a[i]==a[j]){
for(k=j;k<n-1;k++){
a[k]=a[k+1];
}
n--;
}
}
}
for(i=0;i<n;i++){
printf("%d ",a[i]);
}
return 0;
}
插入
#include<stdio.h>
int main(){
int a[11]={1,2,3,4,5,6,7,8,9};
int i,j,n=9;
int insert=3;
for(i=n-1;i>=0;i--){
if(a[i]>insert)
//升序排序的序列插入,如果是降序则a[i]<insert;
{
a[i+1]=a[i];
}
else
break;
//不要忘记退出循环!!!
}
a[i+1]=insert;
//将数组元素后移后腾出的位置放入insert的值;
for(i=0;i<n+1;i++){
printf("%d ",a[i]);
}
return 0;
}
删除
在去重时用到
#include<stdio.h>
int main(){
int a[12]={1,2,3,3,4,5,6,3,7,8,9};
int i,j,n=11;
int del=3;
for(i=0;i<n;i++)
{
if(a[i]==del){
for(j=i;j<n;j++){
a[j]=a[j+1];
}
i--;//防止下一个数也是del
n--;
}
}
for(i=0;i<n;i++){
printf("%d ",a[i]);
}
return 0;
}
合并
题目描述
已知数组a中有m个按升序序排列的元素,数组b中有n个降序排列的元素,编程将a与b中的所有元素按降序存入数组c中。
输入
输入有两行,第一行首先是一个正整数m,然后是m个整数;第二行首先是一个正整数n,然后是n个整数,m, n均小于等于1000000。
输出
输出合并后的m+n个整数,数据之间用空格隔开。输出占一行。
样例输入
4 1 2 5 7
3 6 4 2
样例输出
7 6 5 4 2 2 1
提示
试图排序的孩子们要小心了~~~~~~
#include<stdio.h>
int a[2000000],b[1000000],c[2000001];
/* 全局变量在静态存储区分配内存,局部变量是在栈上分配内存空间的。
栈内存,系统默认值为最大1Mb,
最大可以申请1024*1024/4=264144个,
堆栈溢出 方法一:申明为全局变量 方法二:存放在堆上 */
int main(){
int m;
int n;
scanf("%d",&n);
int i,j,t;
for(i=n-1;i>=0;i--){
scanf("%d",&a[i]);
}
scanf("%d",&m);
for(i=0;i<m;i++){
scanf("%d",&b[i]);
}
i=0;j=0;
int k=0;
while(i<n&&j<m){
if(a[i]>b[j]){
c[k++]=a[i++];
}
else
c[k++]=b[j++];
}
while(i<n){
c[k++]=a[i++];
}
while(j<m){
c[k++]=b[j++];
}
for(i=0;i<n+m;i++)
{
if(i==0){
printf("%d",c[i]);
}
else
printf(" %d",c[i]);
}
return 0;
}
二分搜索
在一个有序的整数数列中搜索给定值x,若找到返回x所在位置,否则返回查找失败标志-1;
int search(int a[],int x,int low,int high){
int mid=(low+high)/2;
if(low>high)
return -1;
else{
if(a[mid]>x)
search(a,x,low,mid-1);
else if(a[mid]<x){
search(a,x,mid+1,high);
}
else if(a[mid]==x){
return mid;
}
}
}