一、冒泡排序
基本原理:两两比较相邻记录的关键字,如果反序则交换。
时间复杂度:最好的情况O(n),最坏的情况O(n²)。
代码:
void bubbleSort(int arr[],size_t len){ for(int i=0;i<len-1;i++){ bool isSwap = false; //记录有没有交换 每次循环开始前置false for(int j=1;j<len-i;j++){//从第一个到除去每次大循环减掉的一个数(最后的最大值) if(arr[j]<arr[j-1]){ //如果当前这个值比它后一个值大 swap(&arr[j],&arr[j-1]);//将这两个值交换 isSwap = true; } } if(!isSwap){ //如果没有再交换说明已经是有序的,直接退出循环,可以减少循环的次数 break; } } }
二、直接插入排序
基本原理:通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。
时间复杂度:时间复杂度也为O(n²), 比冒泡法和选择排序的性能要更好一些。
代码:
void insertSort(int arr[],size_t len){ for(int i=1;i<len;i++){//把arr[i]插入到前面,使用arr[0..i]区间都有序 int j=i-1; int data = arr[i]; for(;j>=0&&data < arr[j];--j){ arr[j+1] = arr[j]; } arr[j+1] = data; } }
三、选择排序
基本原理:首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置,然后,再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾。以此类推,直到所有元素均排序完毕。
时间复杂度:与冒泡排序同为O(n^2),但简单选择排序的性能要略优于冒泡排序
代码:
void selectSort(int arr[],size_t len){ for(int i=0;i<len-1;i++){ int maxInd = 0; //记录最大值 for(int j=1;j<len-i;j++){ if(arr[maxInd] < arr[j]){ maxInd = j; } } if(maxInd != len-1-i) swap(&arr[maxInd],&arr[len-1-i]); } }
四、鸡尾酒排序
基本原理:定义最大值和最小值的下标,找出最大值放在最右边,最小值放在最左边,直到排成有序数列。
时间复杂度:其时间复杂度最好情况为O(n)、最差与平均情况为O(n²),
空间复杂度:O(1)。
代码:
void cookSort(int arr[],size_t len){ for(int i=0;i<len/2;i++){ int minInd = i; int maxInd = i; for(int j=i+1;j<len-i;j++){ if(arr[j]<arr[minInd]){ minInd = j; } if(arr[maxInd]<arr[j]){ maxInd = j; } } if(minInd != i){ swap(&arr[minInd],&arr[i]); } if(maxInd == i){ maxInd = minInd; } if(maxInd != len-1-i){ swap(&arr[maxInd],&arr[len-1-i]); } } }
五、二分插入排序
基本原理:采用二分查找,来找到待排序元素的插入位置,然后移动元素,将待排序的元素插入序列中。
时间复杂度:时间复杂度为O(n2)。
空间复杂度:O(1)。
代码:
void binSort(int arr[],size_t len){ for(int i=1;i<len;i++){ int left = 0; int right = i-1; int data = arr[i]; while(left<=right){ int mid = (left+right)/2; if(data<arr[mid]){ right = mid-1; }else{ left = mid+1; } } int j = i-1; for(;j>right;--j){ arr[j+1] = arr[j]; } arr[j+1] = data; } }
六、希尔排序
基本原理:先将整个待排序的记录序列分割成为若干子序列分别进行直接插入排序。
时间复杂度:其时间复杂度为O(n^3/2),要好于直接插入排序的O(n^2)
代码:
void shellSort(int arr[],size_t len){ for(int step = len/2;step>0;step = step/2){//分组 for(int j = step;j<len;j++){ int data = arr[j]; int k = j-step; for(;k>=0&&data<arr[k];k-=step){ arr[k+step] = arr[k]; } arr[k+step] = data; } } }
七、快速排序
基本原理:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列
时间复杂度:时间复杂度为O(nlogn)。
代码:
void quick(int arr[],int left,int right){ int data = arr[left]; int i = left; int j = right; while(i<j){ while(i<j&&data<=arr[j]){--j;} if(i<j) arr[i] = arr[j]; while(i<j&&arr[i]<=data){++i;} if(i<j) arr[j] = arr[i]; } arr[i] = data; if(i-left>1){ quick(arr,left,i-1); } if(right-i>1){ quick(arr,i+1,right); } } void quickSort(int arr[],size_t len){ quick(arr,0,len-1); }
先这样吧。。。剩下明天写 睡觉了。
原文:https://www.cnblogs.com/jiangyu0331/p/11644342.html