ソートの中には、"実際には元のデータは並び替えずに、並び替えたデータを作り出す" ソートというのもあります。
c で行数制限などほぼ無意味なのに…。
c
1#include <stdio.h>
2#define M 50 //処理可能最大文字列長
3#define N 27 //ソート対象文字(b)の文字数
4int main(void){
5 int i, j, c; //(配列以外の)変数
6 char a[N+1]={0}, b[N+1]=" abcdefghijklmnopqrstuvwxyz"; //配列
7 for(i=0; i<M && (c=getchar())!=EOF; i++) //入力(これは入力の為のループなのです!)
8 { for(j=0; j<N && b[j]!=c; j++); a[j]++; } //処理
9 for(i=0, b[0]='-'; i<N; i++) for(j=0; j<a[i]; j++) putchar(b[i]); putchar('\n'); //出力
10}
plain
1brick quiz whangs jumpy veldt fox.
2-----abcdefghiijklmnopqrstuuvwxyz
plain
1super califragilistic expiali docious
2---aaacccdeefgiiiiiiillloopprrssstuux
matukeso さんの『 0x1f で AND 』を用いれば、処理の行は a[c & 0x1f]++;
だけになるので、ループの制限は問題無さそうで、そしたらいっそ b も無くして出力もfor(i=0; i<N; i++) for(j=0; j<a[i]; j++) putchar(i+(i?0x60:0x2d)); putchar('\n');
ですかねぇ。
分布数えソート。
a に入力して b の後半にカウントして a に並べて(もしくは直接)出力。並べる部分が処理だと言われそう。
c
1#define __STDC_WANT_LIB_EXT1__ 1
2#include <stdio.h>
3#define M 50 //処理可能最大文字列長
4#define N 27 //ソート対象文字(b)の文字数
5int main(void) {
6 char *t, *p; //(配列以外の)変数
7 char a[M+1], b[N+1+N]=" abcdefghijklmnopqrstuvwxyz"; //配列
8#ifdef __STDC_LIB_EXT1__
9 gets_s(a, M+1); //入力
10#else
11 gets(a); //入力
12#endif
13 for(t=a, p=b; *p; *++t||(t=a,p++)) p[N+1]+=(*t==*p); //処理
14 for(t=a, p=b, b[0]='-'; *p; p++) while(p[N+1]--) *t++=*p; *t='\0'; printf("%s\n", a); //a に展開して出力
15 //for(p=b, b[0]='-'; *p; p++) while(p[N+1]--) putchar(*p); putchar('\n'); //直接出力(こっちの方が出力のためのループっぽい)
16}
選択(外部)ソート(?)。
a に入力して並び順に選んで b に溜めて出力。
c
1#define __STDC_WANT_LIB_EXT1__ 1
2#include <stdio.h>
3#define M 50 //処理可能最大文字列長
4int main(void) {
5 char a[M+1], b[M+1]; //配列
6#ifdef __STDC_LIB_EXT1__
7 gets_s(a, M+1); //入力
8#else
9 gets(a); //入力
10#endif
11 //(配列以外の)変数: i=入力文字, p=並び順文字+転記文字, o=出力先
12 char *i=a, *p=" -aabbccddeeffgghhiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz", *o=b;
13 for(; *p; *++i||(i=a,p+=2)) *p==*i&&(*o++=p[1]); *o='\0'; //処理
14 printf("%s\n", b); //出力
15}
選択ソート(コード依存)。
c
1#define __STDC_WANT_LIB_EXT1__ 1
2#include <stdio.h>
3#define M 50 //処理可能最大文字列長
4int main(void) {
5 char a[M+1]; //配列
6#ifdef __STDC_LIB_EXT1__
7 gets_s(a, M+1); //入力
8#else
9 gets(a); //入力
10#endif
11 char *p=a, *q=p+1, c; //(配列以外の)変数
12 for(; *p&&(*q||(*p==' '&&(*p='-')&&0)); *++q||(q=++p+1)) *p>*q&&(c=*q,*q=*p,*p=c); //処理
13 printf("%s\n", a); //出力
14}