冒泡排序、插入排序、选择排序、快速排序、二分查找(Objective-C实现)

简介:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
#pragma mark - 冒泡排序
/**
  1. 首先将所有待排序的数字放入工作列表中。
  2. 从列表的第一个数字到倒数第二个数字,逐个检查:若某一位上的数字大于他的下一位,则将它与它的下一位交换。
  3. 重复2号步骤(倒数的数字加1。例如:第一次到倒数第二个数字,第二次到倒数第三个数字,依此类推...),直至再也不能交换。
  
  平均时间复杂度:O(n^2)
  平均空间复杂度:O(1)
  */
- (NSMutableArray *)BubbleSortOC:(NSArray *)array
{
     id temp;
     int  i, j;
     
     NSMutableArray *arr = [NSMutableArray arrayWithArray:array];
     for  (i=0; i < [arr count] - 1; ++i) {
         for  (j=0; j < [arr count] - i - 1; ++j) {
             if  (arr[j] > arr[j+1]) {     // 升序排列
                 temp = arr[j];
                 arr[j] = arr[j+1];
                 arr[j+1] = temp;
             }
         }
     }
     
     return  arr;
}
 
#pragma mark - 插入排序
/**
  1. 从第一个元素开始,认为该元素已经是排好序的。
  2. 取下一个元素,在已经排好序的元素序列中从后向前扫描。
  3. 如果已经排好序的序列中元素大于新元素,则将该元素往右移动一个位置。
  4. 重复步骤3,直到已排好序的元素小于或等于新元素。
  5. 在当前位置插入新元素。
  6. 重复步骤2。
  
  平均时间复杂度:O(n^2)
  平均空间复杂度:O(1)
  */
- (NSMutableArray *)InsertSortOC:(NSArray *)array
{
     id temp;
     int  i, j;
     
     NSMutableArray *arr = [NSMutableArray arrayWithArray:array];
     for  (i=1; i < [arr count]; ++i) {
         temp = arr[i];
         for  (j=i; j > 0 && temp < arr[j-1]; --j) {
             arr[j] = arr[j-1];
         }
         arr[j] = temp;       // j是循环结束后的值
     }
     
     return  arr;
}
 
#pragma mark - 选择排序
/**
  1. 设数组内存放了n个待排数字,数组下标从1开始,到n结束。
  2. i=1
  3. 从数组的第i个元素开始到第n个元素,寻找最小的元素。(具体过程为:先设arr[i]为最小,逐一比较,若遇到比之小的则交换)
  4. 将上一步找到的最小元素和第i位元素交换。
  5. 如果i=n-1算法结束,否则回到第3步
  
  平均时间复杂度:O(n^2)
  平均空间复杂度:O(1)
  */
- (NSMutableArray *)SelectionSortOC:(NSArray *)array
{
     id temp;
     int  min, i, j;
     
     NSMutableArray *arr = [NSMutableArray arrayWithArray:array];
     for  (i=0; i < [arr count]; ++i) {
         min = i;
         for  (j = i+1; j < [arr count]; ++j) {
             if  (arr[min] > arr[j]) {
                 min = j;
             }
         }
         if  (min != i) {
             temp = arr[min];
             arr[min] = arr[i];
             arr[i] = temp;
         }
     }
     
     return  arr;
}
 
#pragma mark - 快速排序
/**
  1. 从数列中挑出一个元素,称为 "基准"(pivot),
  2. 重新排序数列,所有元素比基准值小的摆放在基准前面,所有元素比基准值大的摆在基准的后面(相同的数可以到任一边)。在这个分割之后,该基准是它的最后位置。这个称为分割(partition)操作。
  3. 递归地(recursive)把小于基准值元素的子数列和大于基准值元素的子数列排序。
  递回的最底部情形,是数列的大小是零或一,也就是永远都已经被排序好了。虽然一直递回下去,但是这个算法总会结束,因为在每次的迭代(iteration)中,它至少会把一个元素摆到它最后的位置去。
  
  平均时间复杂度:O(n^2)
  平均空间复杂度:O(nlogn)       O(nlogn)~O(n^2)
  */
- ( void )QuickSorkOC:(NSMutableArray *)array Count:(NSInteger)count
{
     NSInteger i = 0;
     NSInteger j = count - 1;
     id pt = array[0];
     
     if  (count > 1) {
         while  (i < j) {
             for  (; j > i; --j) {
                 if  (array[j] < pt) {
                     array[i++] = array[j];
                     break ;
                 }
             }
             for  (; i < j; ++i) {
                 if  (array[i] > pt) {
                     array[j--] = array[i];
                     break ;
                 }
             }
             array[i] = pt;
             [self QuickSorkOC:array Count:i];
             [self QuickSorkOC:array Count:count - i - 1];
         }
     }
}
 
#pragma mark - 二分查找法
/**
  *  当数据量很大适宜采用该方法。
     采用二分法查找时,数据需是排好序的。 
     基本思想:假设数据是按升序排序的,对于给定值x,从序列的中间位置开始比较,如果当前位置值等于x,则查找成功;若x小于当前位置值,则在数列的前半段 中查找;若x大于当前位置值则在数列的后半段中继续查找,直到找到为止。
  */
- (NSInteger)BinarySearch:(NSArray *)array target:(id)key
{
     NSInteger left = 0;
     NSInteger right = [array count] - 1;
     NSInteger middle = [array count] / 2;
     
     while  (right >= left) {
         middle = (right + left) / 2;
         
         if  (array[middle] == key) {
             return  middle;
         }
         if  (array[middle] > key) {
             right = middle - 1;
         }
         else  if  (array[middle] < key) {
             left = middle + 1;
         }
     }
     return  -1;
}
 
- ( void )print:(NSArray *)array
{
     for  (id m in array) {
         NSLog(@ "%@" , m);
     }
     NSLog(@ "-----------------" );
}


?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
// 测试
 
     Person *person1 = [[Person alloc] init];
     NSMutableArray *array = [NSMutableArray arrayWithObjects:@8, @5, @9, @2, @5, @7, nil];
     
#pragma mark - 冒泡排序
     
     NSArray *arr1 = [NSArray arrayWithArray:[person1 BubbleSortOC:array]];
     [person1 print:arr1];
     
#pragma mark - 插入排序
     
     NSArray *arr2 = [NSArray arrayWithArray:[person1 InsertSortOC:array]];
     [person1 print:arr2];
     
#pragma mark - 选择排序
     
     NSArray *arr3 = [NSArray arrayWithArray:[person1 SelectionSortOC:array]];
     [person1 print:arr3];
     
#pragma mark - 快速排序
     
     NSMutableArray *arr4 = [NSMutableArray arrayWithArray:array];
     [person1 QuickSorkOC:arr4 Count:[arr4 count]];
     [person1 print:arr4];
     
#pragma mark - 二分查找法
     
     NSInteger dest = [person1 BinarySearch:arr3 target:@7];
     NSLog(@ "%ld" , ( long )dest);

目录
相关文章
|
算法 数据安全/隐私保护 iOS开发
|
存储 缓存 iOS开发
深入Objective-C Runtime机制(一):类和对象的实现
1.概要      对于Runtime系统,相信大部分iOS开发工程师都有着或多或少的了解。对于Objective-C,Runtime系统是至关重要的,可以说是Runtime系统让Objective-C成为了区分于C语言,C++之外的一门独立开发语言,让OC在拥有了自己的面向对象的特性以及消息发送机制。并且因为其强大的消息发送机制,也让很多人认为Object
1988 0
|
存储 iOS开发
上古时代 Objective-C 中哈希表的实现
因为 ObjC 的 runtime 只能在 Mac OS 下才能编译,所以文章中的代码都是在 Mac OS,也就是 x86_64 架构下运行的,对于在 arm64 中运行的代码会特别说明。 写在前面 文章会介绍上古时代 Objective-C 哈希表,也就是 NXHashTable : NXHashTable 的实现 NXHashTable 的性
1355 0
|
iOS开发
iOS,Objective-C,相册功能的实现。
#import "ViewController.h" #define kuan [UIScreen mainScreen].bounds.size.width #define gao [UIScreen mainScreen].
872 0