使用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; 
}
相关文章
|
19天前
|
搜索推荐 算法 C语言
【排序算法】八大排序(上)(c语言实现)(附源码)
本文介绍了四种常见的排序算法:冒泡排序、选择排序、插入排序和希尔排序。通过具体的代码实现和测试数据,详细解释了每种算法的工作原理和性能特点。冒泡排序通过不断交换相邻元素来排序,选择排序通过选择最小元素进行交换,插入排序通过逐步插入元素到已排序部分,而希尔排序则是插入排序的改进版,通过预排序使数据更接近有序,从而提高效率。文章最后总结了这四种算法的空间和时间复杂度,以及它们的稳定性。
63 8
|
19天前
|
搜索推荐 算法 C语言
【排序算法】八大排序(下)(c语言实现)(附源码)
本文继续学习并实现了八大排序算法中的后四种:堆排序、快速排序、归并排序和计数排序。详细介绍了每种排序算法的原理、步骤和代码实现,并通过测试数据展示了它们的性能表现。堆排序利用堆的特性进行排序,快速排序通过递归和多种划分方法实现高效排序,归并排序通过分治法将问题分解后再合并,计数排序则通过统计每个元素的出现次数实现非比较排序。最后,文章还对比了这些排序算法在处理一百万个整形数据时的运行时间,帮助读者了解不同算法的优劣。
58 7
|
6月前
|
NoSQL 程序员 Redis
C语言字符串的设计缺陷
C语言字符串的设计缺陷
54 1
|
2月前
|
算法 C语言
【C语言】排序查找
【C语言】排序查找
|
2月前
|
C语言 C++
【C语言】解决不同场景字符串问题:巧妙运用字符串函数
【C语言】解决不同场景字符串问题:巧妙运用字符串函数
|
3月前
|
存储 C语言
【C语言基础考研向】10 字符数组初始化及传递和scanf 读取字符串
本文介绍了C语言中字符数组的初始化方法及其在函数间传递的注意事项。字符数组初始化有两种方式:逐个字符赋值或整体初始化字符串。实际工作中常用后者,如`char c[10]=&quot;hello&quot;`。示例代码展示了如何初始化及传递字符数组,并解释了为何未正确添加结束符`\0`会导致乱码。此外,还讨论了`scanf`函数读取字符串时忽略空格和回车的特点。
|
3月前
|
存储 Serverless C语言
【C语言基础考研向】11 gets函数与puts函数及str系列字符串操作函数
本文介绍了C语言中的`gets`和`puts`函数,`gets`用于从标准输入读取字符串直至换行符,并自动添加字符串结束标志`\0`。`puts`则用于向标准输出打印字符串并自动换行。此外,文章还详细讲解了`str`系列字符串操作函数,包括统计字符串长度的`strlen`、复制字符串的`strcpy`、比较字符串的`strcmp`以及拼接字符串的`strcat`。通过示例代码展示了这些函数的具体应用及注意事项。
143 7
|
2月前
|
NoSQL 算法 Redis
Redis的实现三:c语言实现平衡二叉树,通过平衡二叉树实现排序集
本博客介绍了如何在C语言中实现一个平衡二叉树,并通过这个数据结构来模拟Redis中的排序集功能。
15 0
|
3月前
|
存储 人工智能 C语言
C语言程序设计核心详解 第八章 指针超详细讲解_指针变量_二维数组指针_指向字符串指针
本文详细讲解了C语言中的指针,包括指针变量的定义与引用、指向数组及字符串的指针变量等。首先介绍了指针变量的基本概念和定义格式,随后通过多个示例展示了如何使用指针变量来操作普通变量、数组和字符串。文章还深入探讨了指向函数的指针变量以及指针数组的概念,并解释了空指针的意义和使用场景。通过丰富的代码示例和图形化展示,帮助读者更好地理解和掌握C语言中的指针知识。
|
3月前
|
C语言
C语言 字符串操作函数
本文档详细介绍了多个常用的字符串操作函数,包括 `strlen`、`strcpy`、`strncpy`、`strcat`、`strncat`、`strcmp`、`strncpy`、`sprintf`、`itoa`、`strchr`、`strspn`、`strcspn`、`strstr` 和 `strtok`。每个函数均提供了语法说明、参数解释、返回值描述及示例代码。此外,还给出了部分函数的自实现版本,帮助读者深入理解其工作原理。通过这些函数,可以轻松地进行字符串长度计算、复制、连接、比较等操作。