排序算法
2016-02-24 16:22
295 查看
有好多种排序方法
选择排序快速排序
冒泡排序
插入排序
等等
选择排序
基本思想:
假设排序表为L[1…n],第i趟排序从表中选择关键字最小的元素与Li交换,第一趟排序可以确定一个元素的最终位置,这样经过n-1趟排序就可以使得整个排序表有序。代码:
- void SelectSort(ElemType arr[], int length) { int i, j, min; ElemType tmp; for (i = 0; i < length - 1; ++i) // 需要n-1趟 { min = i; for (j = i + 1; j < length; ++j) { if (arr[j] < arr[min]) // 每一趟选择元素值最小的下标 { min = j; } } if (min != i) // 如果第i趟的Li元素值该趟找到的最小元素值,则交换,以使Li值最小 { tmp = arr[i]; arr[i] = arr[min]; arr[min] = tmp; } } }
快速排序
基本思想:
基于分治法,在待排序的n个元素中任取一个元素pivot作为基准,通过一趟排序将待排序表划分为独立的两部分L[1..k-1]和L[k+1 .. n],使得第一部分中的所有元素值都小于pivot,而第二部分中的所有元素值都大于pivot,则基准元素放在了其最终位置L(K)上,这个过程为一趟快速排序。而后分别递归地对两个子表重复上述过程,直到每部分内只有一个元素或为空为止,即所有元素都放在了其最终位置上。代码:
- int Partition(ElemType arr[], int left, int right) { ElemType pivot = arr[left]; // 以当前表中第一个元素为枢轴值 while (left < right) { // 从右向左找一个比枢轴值小的元素的位置 while (left < right && arr[right] >= pivot) { --right; } arr[left] = arr[right]; // 将比枢轴值小的元素移动到左端 // 从左向右查找比枢轴值大的元素的位置 while (left < right && arr[left] <= pivot) { ++left; } arr[right] = arr[left];// 将比枢轴值大的元素移动到右端 } arr[left] = pivot; // 将枢轴元素放在最终位置 return left; } - void QuickSort(ElemType arr[], int left, int right) { if (left < right) { int pivotPos = Partition(arr, left, right); // 划分 QuickSort(arr, left, pivotPos - 1); // 快速排序左半部分 QuickSort(arr, pivotPos + 1, right); // 快速排序右半部分 } }
冒泡排序
基本思想:
假设待排序的表长为n, 从后向前或从前向后两两比较相邻元素的值,若为逆序,则交换之,直到序列比较完。这样一回就称为一趟冒泡。这样值较大的元素往下“沉”,而值较小的元素入上“浮”。结果展示:
/*冒泡排序 分析详解:原始数据: 28, 30, 19, 2, 23 第一趟: 第一次:28, 30, 19, 2, 23 第二次:28, 19, 30, 2, 23 第三次:28, 19, 2, 30, 23 第四次:28, 19, 2, 23, 30 第二趟: 第一次:19, 28, 2, 23, 30 第二次:19, 2, 28, 23, 30 第三次:19, 2, 23, 28, 30 第三趟: 第一次:2, 19, 23, 28, 30 第二次:2, 19, 23, 28, 30 第四趟: 第一次:2, 19, 23, 28, 30 */
代码:
void BubbleSort(ElemType arr[], int length) { int i, j; ElemType tmp; for (i = 0; i < length - 1; ++i)// 趟次 { for (j = i + 1; j < length; ++j) { if (arr[i] > arr[j]) { tmp = arr[i]; arr[i] = arr[j]; arr[j] = tmp; } } } }
插入排序
基本思想:
将等排序列划分为有序与无序两部分,然后再依次将无序部分插入到已经有序的部分,最后就可以形成有序序列。操作步骤:
1)查找出元素L(i)在表中的插入位置K;2)将表中的第K个元素之前的元素依次后移一个位置;
3)将L(i)复制到L(K)。
代码:
-(void)insertSortWithArray:(NSArray *)aData{ NSMutableArray *data = [[NSMutableArray alloc]initWithArray:aData]; for (int i = 1; i < [data count]; i++) { id tmp = [data objectAtIndex:i]; int j = i-1; while (j != -1 && [data objectAtIndex:j] > tmp) { [data replaceObjectAtIndex:j+1 withObject:[data objectAtIndex:j]]; j--; } [data replaceObjectAtIndex:j+1 withObject:tmp]; } NSLog(@"插入排序后的结果:%@",[data description]); [data release]; }
相关文章推荐
- leetcode 292. Nim Game(拿石子游戏)
- 浮点转字符串性能比较
- 宁要混蛋不要老好人——一个互联网创业者的用人观
- PHP-xml-1
- MyIsam和InnoDB的区别
- zookeeper 系列文章
- iOS NSInvocation
- js获取地址栏参数
- C++基础::字符串流(stringstream)
- 老李推荐:第14章9节《MonkeyRunner源码剖析》 HierarchyViewer实现原理-遍历控件树查找控件
- 深入浅出数据仓库中SQL性能优化之Hive篇
- Android Volley完全解析(四),带你从源码的角度理解Volley
- CodeForces 629 B. Far Relative’s Problem(水~)
- Android中高亮变色显示文本中的关键字
- Window7下安装Jmeter
- codevs 1515 跳 贪心+lucas
- 统计文件目录下所有文件个数并打印文件名
- 现代操作系统学习之进程与线程
- PHP与MySQL学习笔记9:创建Web数据库
- Android Volley完全解析(三),定制自己的Request