1、插入排序
作用域慢慢扩大,始终保持作用域中的元素有序。
时间复杂度:O(n^2)
空间复杂度:O(1)
#include <iostream> using namespace std; void sort(int *arr,int length) //传入数组首地址和数组长度 { int cur, preindex; //定义要插入的值和比较元素的下标 for (int i = 1; i < length; i++) //一共需要循环 n-1 轮 { cur = arr[i]; //插入的元素 preindex = i - 1; //从插入元素的前一个元素开始比较 while (cur < arr[preindex] && preindex >= 0) //若元素大于插入元素 { arr[preindex + 1] = arr[preindex]; //元素向后移 --preindex; } arr[preindex + 1] = cur; //把插入元素插到相应位置 } } int main() { int arra[] = {12,12,54,1745,45,45,469,789,789}; int length = sizeof(arra) / sizeof(arra[0]); //计算数组长度 sort(arra,length); //调用排序算法 for (size_t i = 0; i < length; i++) //输出排序后的数组 cout << arra[i] << " "; system("pause"); return 0; }
2、冒泡排序
两两比较,将最大的元素放到末尾,并使作用域慢慢变小。
时间复杂度为:O( n^2 ) ;
空间复杂度:
空间复杂度就是在交换元素时那个临时变量所占的内存空间;
最优的空间复杂度就是开始元素顺序已经排好了,则空间复杂度为:0;
最差的空间复杂度就是开始元素逆序排序了,则空间复杂度为:O(n);
平均的空间复杂度为:O(1);unsigned int size = 5; //定义数组大小 int testArray[5] = { 4, 1, 2, 6, 8 }; //创建数组 for (int i = 1; i < size; i++) //外层循环 { for (int j = 0; j < size - i; j++) //内层循环 { if (testArray[j]>testArray[j + 1]) //交换条件 swap(testArray[j], testArray[j + 1]); } } for (int sp : testArray) //遍历数组 { cout << sp <<" "; //输出结果 }
3、选择排序
在序列中,选择最小的元素放在最前面,并逐步缩小作用域。其与冒泡排序不同的是:冒泡排序是两两比较,选择较大的数、而选择排序是每次直接在作用域中遍历,寻找最小的元素,将其置前。
时间复杂度:O(n)
空间复杂度:O(1)
n = arr.size(); for(int i = 0;i < n-1;i++){ int min = 1; for(int j = i + 1;j < n;j++){ if(arr[j] < arr[min]){ min = j; } swap(arr[i],arr[min]); } }
4、归并排序
因为将两个完成排序的序列,整体进行排序会简单很多,归并排序就是这个思想,其将序列不断二分,并在将其回溯的时候完成对每个小序列的排序,之后便实现了整个数组的排序工作。
时间复杂度:O(nlog2n)
空间复杂度:O(n)
#include <iostream> #include <cstdlib> #include <cstdio> using namespace std; int n,a[12000],b[12000]; void merge(int low,int mid,int high) { int i=low,j=mid+1,k=low; while (i<=mid && j<=high) { if (a[i]<a[j]) b[k++]=a[i++]; else b[k++]=a[j++]; } while (i<=mid) b[k++]=a[i++]; while (j<=high) b[k++]=a[j++]; for (int i=low;i<=high;i++) a[i]=b[i]; } void mergesort(int x,int y) { if (x>=y) return; int mid=(x+y)/2; mergesort(x,mid); mergesort(mid+1,y); merge(x,mid,y); } int main() { cin >>n; for (int i=1;i<=n;i++) cin >>a[i]; mergesort(1,n); //调用函数 for (int i=1;i<=n;i++) cout <<a[i] <<" "; return 0; }