Objective C 语言 数组排序

Objective-C阿木 发布于 18 天前 6 次阅读


摘要:

数组排序是编程中常见的需求,Objective-C作为iOS和macOS开发的主要语言,其数组排序功能同样重要。本文将围绕Objective-C语言数组排序这一主题,详细介绍几种常见的排序算法,并给出相应的代码实现,旨在帮助开发者更好地理解和应用数组排序技术。

一、

在Objective-C中,数组是一种非常常用的数据结构,用于存储一系列有序或无序的数据。数组排序是数据处理的基础,也是编程技能的重要体现。本文将探讨几种在Objective-C中常用的数组排序算法,包括冒泡排序、选择排序、插入排序、快速排序和归并排序等。

二、冒泡排序

冒泡排序是一种简单的排序算法,它重复地遍历要排序的数列,一次比较两个元素,如果它们的顺序错误就把它们交换过来。遍历数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。

objective-c

void bubbleSort(NSMutableArray array) {


if (array == nil || [array count] <= 1) {


return;


}



BOOL swapped;


NSInteger n = [array count];


for (NSInteger i = 0; i < n - 1; i++) {


swapped = NO;


for (NSInteger j = 0; j < n - i - 1; j++) {


if ([array[j] compare:array[j + 1]] > 0) {


[array exchangeObjectAtIndex:j withObjectAtIndex:j + 1];


swapped = YES;


}


}


// 如果在这一轮遍历中没有发生交换,说明数组已经排序完成


if (!swapped) {


break;


}


}


}


三、选择排序

选择排序是一种简单直观的排序算法。它的工作原理是:首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置,然后,再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾。以此类推,直到所有元素均排序完毕。

objective-c

void selectionSort(NSMutableArray array) {


if (array == nil || [array count] <= 1) {


return;


}



NSInteger n = [array count];


for (NSInteger i = 0; i < n - 1; i++) {


NSInteger minIndex = i;


for (NSInteger j = i + 1; j < n; j++) {


if ([array[j] compare:array[minIndex]] < 0) {


minIndex = j;


}


}


if (minIndex != i) {


[array exchangeObjectAtIndex:i withObjectAtIndex:minIndex];


}


}


}


四、插入排序

插入排序是一种简单直观的排序算法。它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。插入排序在实现上,通常采用in-place排序(即只需用到O(1)的额外空间的排序)。

objective-c

void insertionSort(NSMutableArray array) {


if (array == nil || [array count] <= 1) {


return;


}



NSInteger n = [array count];


for (NSInteger i = 1; i < n; i++) {


id key = array[i];


NSInteger j = i - 1;



// 将大于key的值向后移动


while (j >= 0 && [array[j] compare:key] > 0) {


array[j + 1] = array[j];


j = j - 1;


}


array[j + 1] = key;


}


}


五、快速排序

快速排序是一种分而治之的排序算法。它将原始数组分为较小的两个子数组,然后递归地对这两个子数组进行排序。

objective-c

void quickSort(NSMutableArray array, NSInteger low, NSInteger high) {


if (low < high) {


NSInteger pivotIndex = partition(array, low, high);


quickSort(array, low, pivotIndex - 1);


quickSort(array, pivotIndex + 1, high);


}


}

NSInteger partition(NSMutableArray array, NSInteger low, NSInteger high) {


id pivot = array[high];


NSInteger i = low - 1;



for (NSInteger j = low; j < high; j++) {


if ([array[j] compare:pivot] < 0) {


i++;


[array exchangeObjectAtIndex:i withObjectAtIndex:j];


}


}


[array exchangeObjectAtIndex:i + 1 withObjectAtIndex:high];


return i + 1;


}


六、归并排序

归并排序是一种分而治之的排序算法。它将原始数组分为两个子数组,分别对这两个子数组进行排序,然后将排序好的子数组合并成一个有序数组。

objective-c

void mergeSort(NSMutableArray array, NSInteger left, NSInteger right) {


if (left < right) {


NSInteger middle = left + (right - left) / 2;


mergeSort(array, left, middle);


mergeSort(array, middle + 1, right);


merge(array, left, middle, right);


}


}

void merge(NSMutableArray array, NSInteger left, NSInteger middle, NSInteger right) {


NSInteger n1 = middle - left + 1;


NSInteger n2 = right - middle;



NSMutableArray L = [NSMutableArray arrayWithCapacity:n1];


NSMutableArray R = [NSMutableArray arrayWithCapacity:n2];



for (NSInteger i = 0; i < n1; i++) {


L[i] = array[left + i];


}


for (NSInteger j = 0; j < n2; j++) {


R[j] = array[middle + 1 + j];


}



NSInteger i = 0, j = 0, k = left;


while (i < n1 && j < n2) {


if ([L[i] compare:R[j]] <= 0) {


array[k] = L[i];


i++;


} else {


array[k] = R[j];


j++;


}


k++;


}



while (i < n1) {


array[k] = L[i];


i++;


k++;


}



while (j < n2) {


array[k] = R[j];


j++;


k++;


}


}


七、总结

本文介绍了Objective-C中几种常见的数组排序算法,包括冒泡排序、选择排序、插入排序、快速排序和归并排序。每种算法都有其特点和适用场景,开发者可以根据实际需求选择合适的排序算法。在实际开发中,熟练掌握这些排序算法对于提高代码质量和效率具有重要意义。

注意:以上代码示例仅供参考,实际应用中可能需要根据具体情况进行调整。