实现对一组无序的字母进行从小到大排序(区分大小写),当两个字母相同时,小写字母放在大写字母前。要求时间复杂度为O(n)

       如果没有时间复杂度的要求,这题可以采用传统的插入排序或者快速排序等方法进行排序,但是传统的排序方法在最好的情况下的时间复杂度都为O(nlogn),显然,不满足题目要求。对于时间复杂度有很高要求的问题,一般可以考虑用空间换时间的方法。这题可以采用如下思路:

       通常,字母为26个,当区分大小写后,变为52个,所以先申请一个长度为52的int型数组,按照aAbBcC...zZ(小写字母保存在下标为偶数的位置,大写字母保存在下标为基数的位置)的顺序依次记录各个字母出现的次数,当记录完成以后,就可以遍历这个数组按照各个字母出现的次数来重组排序后的数组,实现代码如下:

package InterView;

public class LetterSort {

	public static void main(String[] args) {
		char[] letter = {'H','e','l','l','o','Q','L','P'};
		Sort(letter);
		for(int i=0;i<letter.length;i++) {
			System.out.print(letter[i]+"");
		}

	}

	private static void Sort(char[] letter) {
		if(letter==null) {
			System.out.println("参数不合法。");
			return;
		}
		//用于保存52个字符出现的次数,小写字母保存在下标为偶数的位置,大写字母保存在奇数的位置
		int[] charCount=new int[54];
		for(int i=0;i<letter.length;i++) {
			//对小写字母出现的次数进行计数
			if(letter[i]>'a'&&letter[i]<'z') {
				charCount[(letter[i]-'a')*2]++;
				//对大写字母出现的次数进行计数
			}else if(letter[i]>'A'&&letter[i]<'Z') {
				charCount[(letter[i]-'A')*2+1]++;
			}
		}
		//根据各个字符出现的次数按顺序生成排序后的字符数组
		int index=0;
		for(int i=0;i<charCount.length;i++) {
			//这个字符在原始字符数组中存在
			if(charCount[i]!=0) {
				//小写字母
				if(i%2==0) {
					for(int j=0;j<charCount[i];j++) {
						letter[index++]=(char) (i/2+'a');
					}
					//大写字母
				}else {
					for(int j=0;j<charCount[i];j++) {
						letter[index++]=(char) ((i-1)/2+'A');
					}
				}
			}
		}
	}

}

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
### 回答1: 可以使用 C 语言中的 qsort() 函数对坐标组进行排序。qsort() 函数需要三个参数:需要排序的数组的首地址、数组中元素的个数、比较元素大小的函数。 示例代码: ``` #include <stdio.h> #include <stdlib.h> struct Point { int x; int y; }; int compare(const void* a, const void* b) { struct Point *pa = (struct Point *)a; struct Point *pb = (struct Point *)b; return (pa->x - pb->x); } int main() { struct Point points[] = {{3, 4}, {1, 2}, {5, 6}, {7, 8}}; int n = sizeof(points) / sizeof(points[0]); qsort(points, n, sizeof(struct Point), compare); for (int i = 0; i < n; i++) { printf("%d, %d\n", points[i].x, points[i].y); } return 0; } ``` 这段代码将定义一个结构体 Point 用来存储坐标点的 x 和 y 坐标,然后使用 qsort() 函数将点按照 x 坐标从小到大排序。compare 函数是用来比较两个点 x 坐标的大小的,它是 qsort() 函数需要的第三个参数。 ### 回答2: 要实现一组无序的坐标组根据x的大小进行从小到大排序,可以使用C语言中的快速排序算法来实现。 快速排序算法的基本思想是通过一趟排序将待排序的记录划分成独立的两部分,其中一部分记录的关键字<=另一部分记录的关键字,然后再分别对这两部分记录进行排序,直到整个序列有序。 首先,定义一个结构体类型来表示坐标,其中包含x和y坐标的成员变量。 ```c typedef struct { int x; int y; } Coordinate; ``` 然后,实现一个比较函数,用于确定两个坐标的大小关系。我们按照x的大小进行比较,如果x相等,则按y的大小进行比较。 ```c int compare(const void *a, const void *b) { Coordinate *coordinateA = (Coordinate *)a; Coordinate *coordinateB = (Coordinate *)b; if (coordinateA->x == coordinateB->x) { return coordinateA->y - coordinateB->y; } else { return coordinateA->x - coordinateB->x; } } ``` 最后,在主函数中创建一个Coordinate数组,并调用qsort函数进行排序。 ```c int main() { Coordinate coordinates[] = {{3, 4}, {1, 2}, {5, 6}, {2, 3}, {4, 5}}; int numCoordinates = sizeof(coordinates) / sizeof(coordinates[0]); qsort(coordinates, numCoordinates, sizeof(Coordinate), compare); for (int i = 0; i < numCoordinates; i++) { printf("(%d, %d) ", coordinates[i].x, coordinates[i].y); } return 0; } ``` 运行以上代码,可以输出排序后的坐标组。 这样,我们就通过C语言实现了对一组无序的坐标组根据x的大小进行从小到大排序。 ### 回答3: 要使用C语言实现无序坐标组根据x的大小进行从小到大排序,可以使用冒泡排序算法来实现。冒泡排序是一种简单但效率较低的排序算法,其基本思想是通过反复交换相邻的元素,依次比较相邻的两个元素大小,从而将最大(或最小)的元素逐渐交换到最后的位置。 下面是一个简单的C语言代码实现: ```c #include <stdio.h> // 定义一个坐标结构体 typedef struct { int x; int y; } Coordinate; // 冒泡排序函数 void bubbleSort(Coordinate arr[], int size) { int i, j; for (i = 0; i < size - 1; i++) { for (j = 0; j < size - i - 1; j++) { if (arr[j].x > arr[j + 1].x) { // 交换位置 Coordinate temp = arr[j]; arr[j] = arr[j + 1]; arr[j + 1] = temp; } } } } int main() { // 定义一个无序的坐标数组 Coordinate coords[] = {{5, 2}, {7, 3}, {2, 1}, {8, 4}, {3, 6}}; int size = sizeof(coords) / sizeof(coords[0]); // 调用冒泡排序函数进行排序 bubbleSort(coords, size); // 输出排序后的结果 printf("排序后的坐标:\n"); for (int i = 0; i < size; i++) { printf("(%d, %d) ", coords[i].x, coords[i].y); } printf("\n"); return 0; } ``` 以上代码中,我们首先定义了一个坐标的结构体`Coordinate`,有两个成员变量`x`和`y`。然后实现了冒泡排序函数`bubbleSort`,内部使用两层循环依次比较并交换相邻的元素。在主函数`main`中初始化了一个无序的坐标数组`coords`,然后调用冒泡排序函数对其进行排序。最后输出排序后的结果。 这样,我们就可以通过C语言实现无序坐标组根据x的大小进行从小到大排序的功能了。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值