排序

记录下我学习的排序方法(排序时间上到下递减,排序:由大到小)
(1) 最大值取出同时以0替代
1.先从已有数组a找出最大值,将其赋值给另外一个数组b的第一个元素。
2.然后把已有数组a为最大值的那个元素变成0放回已有数组a。
3.重复1,值赋给另外一个数组b的下一个元素。
4重复1,2,直到最大值也是0时直接结束循环
5,按顺序输出的b就是a的重排。

例:

#include<stdio.h>
#include<stdlib.h>
int main()
{
	int a[8]={3,4,6,1,9,5};
	int b[8];
	int max=a[0],i,J,j=0;
	while(max!=0){
		max=0;
	for(i=0;i<6;i++){
		if(a[i]>=max){
			max=a[i];
			J=i;
		}
	}
	b[j]=max;
	a[J]=0;
	j++;
    }
    for(i=0;i<6;i++){
    	printf("%d",b[i]);
	}

	return 0;
}

(2) 冒泡排序

  1. 从第一个元素a开始,判断下一个元素b是否大于它
  2. 若b大于a,交换b和a的值(达成a,b值的顺序互换使顺序为大到小),再次使数组编号回到0,重复1
  3. 否则跳过b判断再下一个元素c
  4. 重复1,2,3直到全部的元素前一位都比本位大,结束。

优点1.可以排序的每一步对并列的数组or字符串跟着排序。
如计算句子每个字母出现次数并排序,达到输出“A=max,B=less,C=more less…….,的情况
缺点,

  1. 慢。
  2. 数组有效长度需要确定。
    例:
#include<stdio.h>
int main(){
	int c[]={7,2,5,5,1,8,2,};
	int i,j,t;
	
#include<stdio.h>
#include<string.h>
 
int main(){
	int c[]={7,2,5,5,1,8,2,};
	int i,j,t;
	
	for(i=0;i<sizeof(c)/sizeof(c[0]);i++){
		for(j=0;j<sizeof(c)/sizeof(c[0]);j++){
			if(c[i]<c[j]){
				int temp=c[j];
				c[j]=c[i];
				c[i]=temp;
			}
		}
		
	}

	for(i=0;i<sizeof(c)/sizeof(c[0])-1;i++){
		printf("%d",c[i]);
	}
	return 0;
}

(3) 快速排序
格式
1.头文件include<stblib.h>
2.调用函数qsort(数组名,数组(有效)长度,sizeof(数组中其中一个元素),cmp(函数));
3.main外
数组类型(int/double/char) cmp(const voida,const voidb){
return (类型)a-(类型)b; //返回a-b的值,>0,<0,=0;
}

例:

#include<stdio.h>
#include<string.h>
#define n 5
int cmp(const void*a,const void*b){
	return *(int*)a-*(int*)b;
} 
int main()
{
	int i,a[1000];
	for(i=0;i<n;i++){
		scanf("%d",&a[i]);
	}
	qsort(a,5,sizeof(a[0]),cmp);
	for(i=0;i<5;i++){
		printf("%d\n",a[i]);
	}
	return 0;
}

目前使用qsort无法同时对多个并列数组进行排序
下文引自https://www.cnblogs.com/yixianyong/p/4571589.html

int num[100];
int cmp ( const void *a , const void *b )
{
return *(int *)a - *(int *)b;
}
qsort(num,100,sizeof(num[0]),cmp);
二、对char类型数组排序(同int类型)
char word[100];
int cmp( const void *a , const void *b )
{
return *(char *)a - *(int *)b;
}
qsort(word,100,sizeof(word[0]),cmp);
三、对double类型数组排序

double in[100];
int cmp( const void *a , const void *b )
{
return *(double *)a > *(double *)b ? 1 : -1;
}
qsort(in,100,sizeof(in[0]),cmp);
四、对结构体一级排序
struct Sample
{
double data;
int other;
}s[100]
//按照data的值从小到大将结构体排序
int cmp( const void *a ,const void *b)
{
return (*(Sample *)a).data > (*(Sample *)b).data ? 1 : -1;
}
qsort(s,100,sizeof(s[0]),cmp);
五、对结构体二级排序
struct Sample
{
int x;
int y;
}s[100];

//按照x从小到大排序,当x相等时按照y从大到小排序
int cmp( const void *a , const void *b )
{
struct Sample *c = (Sample *)a;
struct Sample *d = (Sample *)b;
if(c->x != d->x) return c->x - d->x;
else return d->y - c->y;
}
qsort(s,100,sizeof(s[0]),cmp);
六、对字符串进行排序
struct Sample
{
int data;
char str[100];
}s[100];

//按照结构体中字符串str的字典顺序排序
int cmp ( const void *a , const void *b )
{
return strcmp( (*(Sample *)a).str , (*(Sample *)b).str );
}
qsort(s,100,sizeof(s[0]),cmp);
附加一个完整点的代码,对字符串二维数组排序:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
char s[2001][1001];
int cmp(const void *a, const void *b){
return strcmp((char *)a,(char *)b);
}
int main(){
int i,n;
scanf("%d",&n);
getchar();
for(i=0;i<n;i++) gets(s[i]);
qsort(s,n,1001*sizeof(char),cmp);
for(i=0;i<n;i++) puts(s[i]);
return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值