使用C语言实现字符串排序

简介: 使用C语言实现字符串排序

一、引言

字符串排序是计算机编程中常见的问题之一。在C语言中,可以使用不同的算法和数据结构来实现字符串的排序。本篇文章将介绍如何使用C语言实现字符串的排序,并给出相应的代码示例。

二、字符串排序算法

  1. 冒泡排序

冒泡排序是一种简单的排序算法,它重复地遍历待排序的字符串,比较相邻的两个字符,如果它们的顺序错误就交换它们,直到没有需要交换的字符为止。

  1. 选择排序

选择排序也是一种简单直观的排序算法。它的工作原理是每一次从待排序的字符串中选择最小(或最大)的一个字符,存放在序列的起始位置,直到全部待排序的字符排完。

  1. 插入排序

插入排序的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。插入排序在实现上,在从后向前扫描过程中,需要反复把已排序元素逐步向后挪位,为最新元素提供插入空间。

  1. 快速排序

快速排序采用分治法策略,通过一趟排序将待排序的数据分割成独立的两部分,其中一部分的所有数据都比另一部分的所有数据要小,然后再按此方法对这两部分数据分别进行快速排序,整个过程可以递归进行,以此达到整个数据变成有序序列。

三、代码实现

以下是使用C语言实现上述四种字符串排序算法的代码示例:

  1. 冒泡排序
#include <stdio.h>
#include <string.h>
void bubbleSort(char arr[][50], int n) {
    int i, j;
    char temp[50];
    for (i = 0; i < n-1; i++) {
        for (j = 0; j < n-i-1; j++) {
            if (strcmp(arr[j], arr[j+1]) > 0) {
                strcpy(temp, arr[j]);
                strcpy(arr[j], arr[j+1]);
                strcpy(arr[j+1], temp);
            }
        }
    }
}
int main() {
    char arr[5][50] = {"C", "A", "B", "D", "E"};
    int n = sizeof(arr)/sizeof(arr[0]);
    bubbleSort(arr, n);
    printf("Sorted array: \n");
    for (int i=0; i<n; i++) {
        printf("%s ", arr[i]);
    }
    return 0;
}
  1. 选择排序
#include <stdio.h>
#include <string.h>
void selectionSort(char arr[][50], int n) {
    int i, j, min_idx;
    char temp[50];
    for (i = 0; i < n-1; i++) {
        min_idx = i;
        for (j = i+1; j < n; j++) {
            if (strcmp(arr[j], arr[min_idx]) < 0) {
                min_idx = j;
            }
        }
        strcpy(temp, arr[min_idx]);
        strcpy(arr[min_idx], arr[i]);
        strcpy(arr[i], temp);
    }
}
int main() {
    char arr[5][50] = {"C", "A", "B", "D", "E"};
    int n = sizeof(arr)/sizeof(arr[0]);
    selectionSort(arr, n);
    printf("Sorted array: \n");
    for (int i=0; i<n; i++) {
        printf("%s ", arr[i]);
    }
    return 0;
}
  1. 插入排序
#include <stdio.h>
#include <string.h>
void insertionSort(char arr[][50], int n) {
    int i, key, j;
    char temp[50];
    for (i = 1; i < n; i++) {
        key = strcmp(arr[i], arr[i-1]);
        j = i - 1;
        while (j >= 0 && strcmp(arr[j], arr[j+1]) > key) {
            strcpy(temp, arr[j]);
            strcpy(arr[j], arr[j+1]);
            strcpy(arr[j+1], temp);
            j = j - 1;
        }
    }
}
int main() {
    char arr[5][50] = {"C", "A", "B", "D", "E"};
    int n = sizeof(arr)/sizeof(arr[0]);
    insertionSort(arr, n);
    printf("Sorted array: \n");
    for (int i=0; i<n; i++) {
        printf("%s ", arr[i]);
    }
    return 0;
}
  1. 快速排序
#include <stdio.h>
#include <string.h>
void swap(char *a, char *b) {
    char temp[50];
    strcpy(temp, a);
    strcpy(a, b);
    strcpy(b, temp);
}
char* partition (char arr[][50], int low, int high) {
    char pivot = arr[high][0];   // pivot element on the last row
    char i = (low - 1);  // Index of smaller element found so far 
  
    for (int j = low; j <= high- 1; j++) {
        if (strcmp(arr[j], pivot) < 0) { // If current element is smaller than pivot 
            i++;   // increment index of smaller element found so far 
            swap(&arr[i][0], &arr[j][0]);  // swap current element with the index of smaller element found so far 
        }
    }
    swap(&arr[i + 1][0], &arr[high][0]);  // At the end of this loop, swap the pivot element to its correct position 
  
    return &arr[i + 1][0];  // return the pointer to the first element of the pivot's new position 
}
  
void quickSort(char arr[][50], int low, int high) {
    if (low < high) { // If the subarray has more than one element 
        char *pi = partition(arr, low, high); // Partition the subarray into two subarrays. One containing elements smaller than the pivot and the other containing elements greater than the pivot. 
  
        quickSort(arr, low, pi - 1); // Sort the subarray on the left side of the pivot 
        quickSort(arr, pi + 1, high);  // Sort the subarray on the right side of the pivot 
    } 
} 
  
int main() {  // Driver program to test above functions 
    char arr[5][50] = {"C", "A", "B", "D", "E"};  // Test data 
    int n = sizeof(arr)/sizeof(arr[0]);  // Number of elements in the array 
  
    quickSort(arr, 0, n - 1);  // Sort the array using quickSort() function 
  
    printf("Sorted array: \n");  // Print the sorted array 
    for (int i=0; i<n; i++) {  // Print each element of array after sorting it using %s format specifier and its index (%d) as prefix. 
        printf("%d %s\n", i, arr[i]); 
    } 
  return 0; 
}
相关文章
|
3月前
|
安全 C语言
C语言中的字符、字符串及内存操作函数详细讲解
通过这些函数的正确使用,可以有效管理字符串和内存操作,它们是C语言编程中不可或缺的工具。
251 15
|
9月前
|
存储 算法 安全
【C语言程序设计——选择结构程序设计】按从小到大排序三个数(头歌实践教学平台习题)【合集】
本任务要求从键盘输入三个数,并按从小到大的顺序排序后输出。主要内容包括: - **任务描述**:实现三个数的排序并输出。 - **编程要求**:根据提示在编辑器中补充代码。 - **相关知识**: - 选择结构(if、if-else、switch) - 主要语句类型(条件语句) - 比较操作与交换操作 - **测试说明**:提供两组测试数据及预期输出。 - **通关代码**:完整代码示例。 - **测试结果**:展示测试通过的结果。 通过本任务,你将掌握基本的选择结构和排序算法的应用。祝你成功!
124 4
|
10月前
|
存储 C语言 开发者
【C语言】字符串操作函数详解
这些字符串操作函数在C语言中提供了强大的功能,帮助开发者有效地处理字符串数据。通过对每个函数的详细讲解、示例代码和表格说明,可以更好地理解如何使用这些函数进行各种字符串操作。如果在实际编程中遇到特定的字符串处理需求,可以参考这些函数和示例,灵活运用。
398 10
|
11月前
|
存储 算法 C语言
C语言中常见的字符串处理技巧,包括字符串的定义、初始化、输入输出、长度计算、比较、查找与替换、拼接、截取、转换、遍历及注意事项
本文深入探讨了C语言中常见的字符串处理技巧,包括字符串的定义、初始化、输入输出、长度计算、比较、查找与替换、拼接、截取、转换、遍历及注意事项,并通过案例分析展示了实际应用,旨在帮助读者提高编程效率和代码质量。
591 4
|
11月前
|
搜索推荐 算法 C语言
【排序算法】八大排序(下)(c语言实现)(附源码)
本文继续学习并实现了八大排序算法中的后四种:堆排序、快速排序、归并排序和计数排序。详细介绍了每种排序算法的原理、步骤和代码实现,并通过测试数据展示了它们的性能表现。堆排序利用堆的特性进行排序,快速排序通过递归和多种划分方法实现高效排序,归并排序通过分治法将问题分解后再合并,计数排序则通过统计每个元素的出现次数实现非比较排序。最后,文章还对比了这些排序算法在处理一百万个整形数据时的运行时间,帮助读者了解不同算法的优劣。
382 7
|
11月前
|
搜索推荐 算法 C语言
【排序算法】八大排序(上)(c语言实现)(附源码)
本文介绍了四种常见的排序算法:冒泡排序、选择排序、插入排序和希尔排序。通过具体的代码实现和测试数据,详细解释了每种算法的工作原理和性能特点。冒泡排序通过不断交换相邻元素来排序,选择排序通过选择最小元素进行交换,插入排序通过逐步插入元素到已排序部分,而希尔排序则是插入排序的改进版,通过预排序使数据更接近有序,从而提高效率。文章最后总结了这四种算法的空间和时间复杂度,以及它们的稳定性。
452 8
|
12月前
|
算法 C语言
【C语言】排序查找
【C语言】排序查找
|
C语言 C++
【C语言】解决不同场景字符串问题:巧妙运用字符串函数
【C语言】解决不同场景字符串问题:巧妙运用字符串函数
125 2
|
存储 C语言
【C语言基础考研向】10 字符数组初始化及传递和scanf 读取字符串
本文介绍了C语言中字符数组的初始化方法及其在函数间传递的注意事项。字符数组初始化有两种方式:逐个字符赋值或整体初始化字符串。实际工作中常用后者,如`char c[10]=&quot;hello&quot;`。示例代码展示了如何初始化及传递字符数组,并解释了为何未正确添加结束符`\0`会导致乱码。此外,还讨论了`scanf`函数读取字符串时忽略空格和回车的特点。
381 8
|
存储 Serverless C语言
【C语言基础考研向】11 gets函数与puts函数及str系列字符串操作函数
本文介绍了C语言中的`gets`和`puts`函数,`gets`用于从标准输入读取字符串直至换行符,并自动添加字符串结束标志`\0`。`puts`则用于向标准输出打印字符串并自动换行。此外,文章还详细讲解了`str`系列字符串操作函数,包括统计字符串长度的`strlen`、复制字符串的`strcpy`、比较字符串的`strcmp`以及拼接字符串的`strcat`。通过示例代码展示了这些函数的具体应用及注意事项。
644 7