快速排序的基本思想:首先选一个轴值(即比较的基准),将待排记录分割成独立的两部分,左侧记录的元素均小于或等于轴值,右侧记录的元素均大于或等于轴值,然后分别对这两部分重复上述过程,直到这个序列有序。该算法的平均时间复杂度为O(log2^n)。
冒泡排序的基本思想:两两比较相邻记录的元素,如果反序则交换,直到没有反序为止。该算法的平均时间复杂度为O(n^2)。
选择排序的基本思想:第i趟排序通过n-i次记录的比较,在n-i+1个记录中选取最小的元素,并和第i个元素交换,直到数组有序。该算法的平均时间复杂度为O(n^2)。
折半查找的基本思想:在有序序列中,取中间元素作为比较对象,若给定值与中间元素相等,则查找成功;若给定值小于中间元素,则在中间元素的左半区继续查找;若给定值大于中间元素,则在中间记录的右半区继续查找,不断重复上述过程,直到查找成功或找不到给定植。该算法的平均时间复杂度为O(log2^n)。
分类的声明文件:
#import <Foundation/Foundation.h>
@interface NSMutableArray (cx)
// 选择排序
- (void)selectSort;
// 冒泡排序
- (void)bubbleSort;
// 快速排序
- (void)quickSort;
// 折半查找
- (int)binSearch:(int)someNumber;
// 查找
- (int)Search:(int)someNumber;
// 遍历数组
- (void)printfArray;
@end
分类的实现文件:
#import "NSMutableArray+cx.h"
// 折半查找
int BinSearch(NSArray *array,int low,int high,int k)
{
if (low>high) return 0; // 递归的边界
int mid = (low + high)/2;
if (k<[[array objectAtIndex:mid] intValue]) return BinSearch(array, low, mid-1, k);
else if (k>[[array objectAtIndex:mid] intValue]) return BinSearch(array, mid+1, high, k);
else return mid;
}
// 快排
int Partition(NSMutableArray *array,int first,int end)
{
int i = first;
int j = end;
while (i<j)
{
while (i<j&&([[array objectAtIndex:i] compare:[array objectAtIndex:j]]<=0))
j--; // 从右往左扫描
// 当发现第i个元素大于第j个元素,停止扫描,进行值的交换
if (i<j) {
[array exchangeObjectAtIndex:i withObjectAtIndex:j];
i++; // 开始对下一个元素进行比较
}
while (i<j&&([[array objectAtIndex:i] compare:[array objectAtIndex:j]]<=0))
i++; // 从左往右扫描
// 当发现第i个元素大于第j个元素,停止扫描,进行值的交换
if (i<j) {
[array exchangeObjectAtIndex:i withObjectAtIndex:j];
j--;
}
}
return i; // i为轴值记录的最终位置
}
// 递归调用 Partition,实现快排
void QuickSort(NSMutableArray *array,int first,int end)
{
int pivot = 0; // 中间位置,轴值
if (first<end) {
pivot = Partition(array, first, end); // 一次划分
QuickSort(array, first, pivot-1); // 递归地对左侧子序列进行快排
QuickSort(array, pivot+1, end); // 递归地对右侧zi序列进行快排
}
}
@implementation NSMutableArray (cx)
// 选择排序
- (void)selectSort
{
for (int i = 0; i<self.count; i++) {
for (int j =i+1; j<self.count; j++) {
if ([[self objectAtIndex:i] compare:[self objectAtIndex:j]]>0) {
[self exchangeObjectAtIndex:i withObjectAtIndex:j];
}
}
}
}
// 冒泡排序
- (void)bubbleSort
{
for (int i = 0; i<self.count; i++) {
for (int j=0; j<self.count-i-1; j++) {
if ([[self objectAtIndex:j] compare:[self objectAtIndex:j+1]]>0) {
[self exchangeObjectAtIndex:j withObjectAtIndex:(j+1)];
}
}
}
}
// 快速排序
- (void)quickSort
{
QuickSort(self,0,(int)self.count-1);
}
// 折半查找
- (int)binSearch:(int)someNumber
{
return BinSearch(self, 0, (int)self.count-1, someNumber);
}
// 无序查找
- (int)Search:(int)someNumber
{
[self quickSort];
return [self binSearch:someNumber];
}
// 遍历数组
- (void)printfArray
{
for (int i = 0; i<self.count; i++) {
NSLog(@"%@",[self objectAtIndex:i]);
}
}
@end
main.m文件
#import <Foundation/Foundation.h>
#import "NSMutableArray+cx.h"
int main()
{
NSMutableArray *array = [NSMutableArray arrayWithObjects:@6,@1,@12,@25,@19,@92, nil];
// 选择排序
//[array selectSort];
// 冒泡排序
//[array bubbleSort];
// 快速排序
//[array quickSort];
// 查找
int num = [array Search:92];
NSLog(@"%d",num);
//[array printfArray];
return 0;
}
执行结果如下