排序
排序的基本概念:
1.排序定义:
重新排列表中的元素,使表中的元素满足关键字递增或递减。
2.稳定性:
若待排序表中存在关键字的值相等的两个或多个元素,使用某种排序算法后,关键字的值相等的元素之间的相对位置较排序之前相同,则称这个算法是稳定的,否则称这个算法是不稳定的。
内部排序:
指在排序期间元素全部存放在内存中的排序。
- 插入排序:每次将一个待排序的序列插入到一个前面已排序好的子序列当中,有这几种插入排序方法:直接插入排序、折半插入排序、希尔排序。
- 交换排序:冒泡排序、快速排序
- 选择排序:简单选择排序、堆排序
- 归并排序
- 基数排序
下面是每种排序算法的代码实现
1.直接插入排序算法:
平均时间复杂度:O(log2)、空间复杂度:O(1)、稳定的排序算法、适用于顺序存储和链式存储。
#include<iostream>
using namespace std;
//直接插入排序算法
void InsertSort(int A[], int n){
int i, j;
//0位置是哨兵,前1个元素已经排序好,从下标为2的元素开始到最后一个元素依次进行插入排序
for(i = 2; i < n; i++){
A[0] = A[i];//A[0]是哨兵,有两个作用:一:用来保存待排序的元素关键字 二:当在从已排序好的最后一个元素向前比较时,可以保证不会越界
//从已排序好的最后一个元素开始比较大小,若最后一个元素大于要排序的元素,则最后一个元素后移一个单位,
//然后与最后一个元素的前一个元素比较,直到出现某个元素小于等于要排序的元素,说明待排序的元素要排在这个元素后面,则直接把待排序元素放在这个元素后面
for(j = i - 1; A[0] < A[j]; j--){
A[j + 1] = A[j];
}
A[j + 1] = A[0];
}
}
int main(){
int arr[] = {
0,9,8,7,6,5,4,3,2,1};//第一位是哨兵,随便什么数字
int len = sizeof(arr) / sizeof(int);//数组长度
//输出排序前的数组
for(int i = 1; i < len; i++){
cout<<arr[i]<<endl;
}
cout<<endl;
InsertSort(arr, len);
//输出排序后的数组
for(int i = 1; i < len; i++){
cout<<arr[i]<<endl;
}
return 0;
}
2.折半插入排序算法:
平均时间复杂度:O(n^2),需要插入n - 1个元素,其中折半查找的时间复杂度为O(log2n),移动的时间复杂度为O(n)、空间复杂度:O(1)、稳定的排序算法,只适用于顺序存储。
#include<iostream>
using namespace std;
//折半插入排序算法-n是数组长度
void BInsertSort(int A[], int n){
int i, j;
int low, high, mid;
//0位置是哨兵,前1个元素已经排序好,从下标为2的元素开始到最后一个元素依次进行插入排序
for(i = 2; i < n; i++){
A[0] = A[i];//A[0]是哨兵
low = 1; high = i - 1;
while(low <= high){
mid = (low + high) / 2;
if(A[mid] > A[0]){
high = mid - 1;
}
else{
low = mid + 1;
}
}
for(j = i - 1; j >= low; j--){
A[j + 1] = A[j];
}
A[j + 1] = A[0];
}
}
int main(){
int arr[] = {
0,9,8,7,6,5,4,3,2,1};//第一位是哨兵,随便什么数字
int len