常用排序算法总结
来源:互联网 发布:微信摇塞子作弊软件 编辑:程序博客网 时间:2024/06/08 11:22
- 常用排序算法:冒泡 选择 直接插入 二分插入 希尔排序 快速排序 归并排序 堆排序
算法的时间复杂度和空间复杂度就不分析了,自行百度,代码如下:
#include<iostream>#include<string>using namespace std;void bubble_sort1(int arr[], int len){ for(int i = 0; i < len-1; i++){ for(int j = len-1; j > i; j--){ if(arr[j] < arr[j-1]){ int tmp = arr[j]; arr[j] = arr[j-1]; arr[j-1] = tmp; } } }}void bubble_sort2(int arr[], int len){ for(int i = len-1; i > 0; i--){ for(int j = 0; j < i; j++){ if(arr[j] > arr[j+1]){ int tmp = arr[j]; arr[j] = arr[j+1]; arr[j+1] = tmp; } } }}void selectSort(int arr[], int len){ for(int i = 0; i < len-1; i++){ int index = i; for(int j = i+1; j < len; j++){ if(arr[j] < arr[index]) index = j; } if(index != i){ int tmp = arr[i]; arr[i] = arr[index]; arr[index] = tmp; } }}//选择排序交换的次数比冒泡排序少很多void insert_sort(int arr[], int len){ for(int i = 1; i < len; i++){ int key = arr[i]; int j = i-1; while(j >= 0 && arr[j] > key){ arr[j+1] = arr[j]; j--; } arr[j+1] = key; }} //直接插入排序int binarySearch(int start, int end, int arr[], int target){ while(start < end){ int mid = (start+end)/2; if(arr[mid] < target) start = mid+1; else end = mid-1; } return start;}//二分插入排序void binary_sort(int arr[], int len){ for(int i = 1; i < len; i++){ int key = arr[i]; if(arr[i-1] > key){ int index = binarySearch(0, i-1, arr, key); for(int j = i; j > index; j--) arr[j] = arr[j-1]; arr[index] = key; } }}// shell 排序 希尔排序 先按步长n进行分组,然后插入排序,然后再减小步长,在进行分组插入排序,一直到步长为n=1为止void shellSort1(int arr[], int len){ for(int gap = len/2; gap > 0; gap /= 2){ for(int i = 0; i < gap; i++){ for(int j = i+gap; j < len; j += gap){ if(arr[j] < arr[j-gap]){ int key = arr[j]; int k = j-gap; while(k >= 0 && arr[k] > key){ arr[k+gap] = arr[k]; k -= gap; } arr[k+gap] = key; } } } }}// shellSort1 代码简化,将后两个for循环简化成一个for循环void shellSort2(int arr[], int len){ for(int gap = len/2; gap > 0; gap /= 2){ for(int j = gap; j < len; j++){ if(arr[j] < arr[j-gap]){ int tmp = arr[j]; int k = j - gap; while(k >= 0 && arr[k] > tmp){ arr[k+gap] = arr[k]; k -= gap; } arr[k+gap] = tmp; } } }}//快速排序算法void quick_sort(int arr[], int left, int right){ if(left < right){ int i = left, j = right, target = arr[left]; while(i < j){ while(i < j && arr[j] > target){ j--; } if(i < j) arr[i++] = arr[j]; while(i < j && arr[i] < target) i++; if(i < j) arr[j--] = arr[i]; } arr[i] = target; quick_sort(arr, left, i-1); quick_sort(arr, i+1, right); }}void merge(int arr[], int tmpArr[], int start, int mid, int end){ int i = start, j = mid+1; int k = 0; while(i <= mid && j <= end){ if(arr[i] > arr[j]) tmpArr[k++] = arr[j++]; else tmpArr[k++] = arr[i++]; } while(i <= mid){ tmpArr[k++] = arr[i++]; } while(j <= end){ tmpArr[k++] = arr[j++]; } for(i = 0; i < k; i++){ arr[start+i] = tmpArr[i]; }}void mergeSort(int arr[], int start, int end, int tmpArr[]){ if(start < end){ int mid = (start+end)/2; mergeSort(arr, start, mid, tmpArr); mergeSort(arr, mid+1, end, tmpArr); merge(arr, tmpArr, start, mid, end); }}int main(){ int arr[] = {2,4,3,2,6,7}; //binary_sort(arr, 6); //shellSort2(arr, 6); int tmpArr[6]; mergeSort(arr, 0, 5, tmpArr); //quick_sort(arr, 0, 5); for(int i = 0; i < 6; i++) cout << arr[i] << endl;}
- 快速排序算法有很多优化方式,比如随机选取基准点,对区间比较小的不使用快速排序,以免递归深度过深。
0 0
- 常用排序算法总结
- 常用排序算法总结
- 常用排序算法总结
- 常用排序算法总结
- 常用排序算法总结
- 常用排序算法总结
- 常用排序算法总结
- 常用排序算法总结
- 常用排序算法总结
- 常用排序算法 总结
- 常用排序算法总结
- 常用排序算法总结
- 常用排序算法总结
- 常用排序算法总结
- 常用排序算法总结
- 常用排序算法总结
- 常用排序算法总结
- 常用排序算法总结
- 【Unity3D UGUI】事件接口(二) 鼠标按下、抬起、点击
- python中的转义字符
- 2015年第六届蓝桥杯C/C++程序设计本科B组省赛 奖券数目(结果填空)
- scrapy爬虫不会被禁止
- 汉诺塔系列1
- 常用排序算法总结
- java通过反编译工具生成源码
- 概率图模型基础
- 环境变量与JAVA环境变量的配置
- 非常强大的shell写的俄罗斯方块
- 多租户过程记录二
- 马虎的算式
- PHPStorm2017去掉参数提示 parameter name hints
- (pat)L2-1. 人以群分