算法 -- iOS开发用Objective_C / Swift3.0实现:快速排序 / 冒泡排序 / 选择排序
2016-12-20 21:21
781 查看
快速排序
假设要排序的数组是A[0]……A[N-1],首先任意选取一个数据(通常选用数组的第一个数)作为关键数据,然后将所有比它小的数都放到它前面,所有比它大的数都放到它后面,这个过程称为一趟快速排序。值得注意的是,快速排序不是一种稳定的排序算法,也就是说,多个相同的值的相对位置也许会在算法结束时产生变动。
一趟快速排序的算法是:
1)设置两个变量i、j,排序开始的时候:i=0,j=N-1;
2)以第一个数组元素作为关键数据,赋值给key,即key=A[0];
3)从j开始向前搜索,即由后开始向前搜索(j–),找到第一个小于key的值A[j],将A[j]和A[i]互换;
4)从i开始向后搜索,即由前开始向后搜索(i++),找到第一个大于key的A[i],将A[i]和A[j]互换;
5)重复第3、4步,直到i=j; (3,4步中,没找到符合条件的值,即3中A[j]不小于key,4中A[i]不大于key的时候改变j、i的值,使得j=j-1,i=i+1,直至找到为止。找到符合条件的值,进行交换的时候i, j指针位置不变。另外,i==j这一过程一定正好是i+或j-完成的时候,此时令循环结束)。
Objective_C: //传进去要排序的数组和数组的第一个元素和最后一个元素的索引 - (void)quickSort:(NSMutableArray *)mArray leftIndex:(int )left rightIndex:(int )right { if (left < right) { int temp = [self getMiddleIndex:mArray leftIndex:left rightIndex:right]; [self quickSort:mArray leftIndex:left rightIndex:temp - 1]; [self quickSort:mArray leftIndex:temp + 1 rightIndex:right]; } } - (int )getMiddleIndex:(NSMutableArray *)mArray leftIndex:(int )left rightIndex:(int )right { int tempValue = [mArray[left] intValue]; while (left < right) { while ((left < right) && (tempValue <= [mArray[right] intValue])) { right --; } if (left < right) { mArray[left] = mArray[right]; } while (left < right && ([mArray[left] intValue] <= tempValue)) { left ++; } if (left < right) { mArray[right] = mArray[left]; } } mArray[left] = [NSNumber numberWithInt:tempValue]; return left; } Swift: public func quickSort(mArray: inout Array<Int>, leftIndex: Int, rightIndex: Int) { if leftIndex < rightIndex { var left = leftIndex var right = rightIndex let temp = getMiddleIndex(mArray: &mArray, leftIndex: &left, rightIndex: &right) quickSort(mArray: &mArray, leftIndex: leftIndex, rightIndex: temp - 1) quickSort(mArray: &mArray, leftIndex: temp + 1, rightIndex: rightIndex) } } private func getMiddleIndex(mArray: inout Array<Int>, leftIndex: inout Int, rightIndex: inout Int) -> (Int) { let tempValue = mArray[leftIndex] while leftIndex < rightIndex { while leftIndex < rightIndex && tempValue <= mArray[rightIndex] { rightIndex -= 1 } if leftIndex < rightIndex { mArray[leftIndex] = mArray[rightIndex] } while leftIndex < rightIndex && mArray[leftIndex] <= tempValue { leftIndex += 1 } if leftIndex < rightIndex { mArray[rightIndex] = mArray[leftIndex] } } mArray[leftIndex] = tempValue return leftIndex }
冒泡排序
冒泡排序算法的运作如下:
1)比较相邻的元素。如果第一个比第二个大,就交换他们两个。
2)对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。在这一点,最后的元素应该会是最大的数。
3)针对所有的元素重复以上的步骤,除了最后一个。
4)持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较
Objective_C: - (void)bubbleSort:(NSMutableArray *)mArray { for (int i = 0; i < mArray.count - 1; i ++) { for (int j = 0; j < mArray.count - i - 1; j ++) { if ([mArray[j] intValue] > [mArray[j + 1] intValue]) { [mArray exchangeObjectAtIndex:j withObjectAtIndex:j + 1]; } } } } Swift: public func bubbleSort(mArray: inout Array<Int>) { for i in 0..<(mArray.count - 1) { for j in 0..<(mArray.count - i - 1) { if mArray[j] > mArray[j + 1] { //交换元素位置 (mArray[j],mArray[j + 1]) = (mArray[j + 1],mArray[j]) } } } }
选择排序
每一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,直到全部待排序的数据元素排完。 选择排序是不稳定的排序方法(比如序列[5, 5, 3]第一次就将第一个[5]与[3]交换,会导致第一个5挪动到第二个5后面)。
Objective_C: - (void)selectSort:(NSMutableArray *)mArray { for (int i = 0; i < mArray.count; i ++) { int minIndex = i; for (int j = i + 1; j < mArray.count; j ++) { if ([mArray[minIndex] intValue] > [mArray[j] intValue]) { minIndex = j; } } if(minIndex != i) { //如果不是无序区的最小值位置不是默认的第一个数据,则交换。 [mArray exchangeObjectAtIndex:i withObjectAtIndex:minIndex]; } } } Swift: public func selectSort(mArray: inout Array<Int>) { for i in 0..<mArray.count { var minIndex = i for j in (i + 1)..<mArray.count { if mArray[minIndex] > mArray[j] { minIndex = j } } if minIndex != i { (mArray[i],mArray[minIndex]) = (mArray[minIndex],mArray[i]) } } }
OC_DEMO下载
Swift_DEMO下载
代码实现不一定是最好的,也不是唯一的,有什么更好的想法欢迎评论或联系我.
相关文章推荐
- 算法 -- iOS开发用Objective_C / Swift3.0实现:直接插入排序 / 二分法插入排序 / 希尔排序
- iOS开发--图形化排序算法比较:快速排序、插入排序、选择排序、冒泡排序
- 冒泡排序、选择排序、堆排序、快速排序、插入排序算法复杂度分析与算法实现(自己总结与转)
- 基本算法简单实现-二分法查找、合并排序、冒泡排序、插入排序、选择排序、快速排序
- 快速排序,冒泡排序,直接选择排序的算法实现
- 几种常见排序算法之Java实现(插入排序、希尔排序、冒泡排序、快速排序、选择排序、归并排序)
- 冒泡排序、选择排序、堆排序、快速排序、插入排序算法复杂度分析与算法实现(自己总结与转)
- 冒泡排序、选择排序、插入排序 算法实现
- 数据结构与算法——三种基础排序算法C#实现(冒泡排序、选择排序、插入排序)
- 快速排序,冒泡排序,直接选择排序的算法
- 我在北京找工作(二):java实现算法<1> 冒泡排序+直接选择排序
- 十二.C语言8种排序算法及其实现 1.希尔排序 2.二分插入法 3.直接插入法 4.带哨兵的直接排序法 5.冒泡排序 6.选择排序 7.快速排序 8.堆排序
- Objective-C ,ios,iphone开发基础:快速实现一个简单的图片查看器
- 内部排序冒泡排序、插入排序、选择排序、快速排序的算法和PHP实现
- 冒泡排序、选择排序、插入排序 算法实现(C++)
- 冒泡排序、选择排序、插入排序 算法实现(C++)
- 算法导论之插入排序,选择排序,归并排序,冒泡排序,希尔排序,堆排序,快速排序的c语言实现
- 【算法】冒泡排序与选择排序的递归实现
- Objective-C ,ios,iphone开发基础:快速实现一个简单的图片查看器
- 我在北京找工作(二):java实现算法<1> 冒泡排序+直接选择排序