1. 冒泡排序
直接插入排序是另外两种的基础也是核心思想:
每次将关键字大小插入到有序区域中(调整是从后向前),直到全部插入有序区域完成
void BubbleSort(int A[],int n){//冒泡
for(int i =0;i <n-1; i++){
bool flag= false;
//本趟冒泡是否发生了交换,无交换则停止
for(int j =n-1; j>i;j--){
if(A[j-1] >A[j]){
swap(A[j-1],A[j]);//所有相邻两个元素逆序则交换
flag = true;
}
}
if(flag == false){
return;//已经有序
}
}
}
测试数据
int d[] ={49,38,65,97,76,13,27,49};
BubbleSort(d,8);
for(int i=0;i<8;i++){
cout <<" " <<d[i];
}
cout <<endl;
2.快速排序
int Partitial(int A[],int low,int high){//基准划分
int pivot = A[low];
while(low< high){
while(low <high && A[high] >= pivot)
--high;//右边找小于p的
A[low] = A[high];
while(low <high && A[low] <= pivot)
++low;
A[high] = A[low];//左边找大于p的
}
A[low] = pivot;//基准放到最终位置
return low;//返回枢纽
}
//实际是N个元素组织成一个二叉树,中序遍历就是递增序列
void QuickSort(int A[],int low,int high){//实现排序
if(low < high){
int pivotpos = Partitial(A,low , high);//划分
QuickSort(A,low ,pivotpos-1);//划分左边
QuickSort(A,pivotpos+1, high);//划分右边
}
}
测试数据
int d[] ={49,38,65,97,76,13,27,49};
QuickSort(d,0,7);
for(int i=0;i<8;i++){
cout <<" " <<d[i];
}
cout <<endl;
3.概述
- 冒泡排序
-
-基本有序 ,最好 ,时间复杂度O(n)
-
-逆序 ,最坏 ,0(n^2)
-
-平均 ,0(n^2)
-
-只需要常数个辅助变量 ,空间 杂度 O(1)
-
-稳定
- 快速排序
-
-划分均匀 ,最好 ,时间复杂度0(nlog n)
-
-正序、逆序 ,最坏 ,0(n^2)
-
-平均 ,O(nlog n)
-
-取决于递归深度 ,空间复杂度 最好,O(n)
-
-最坏,O(log2 n)
-
-不稳定
2021 ,冲冲冲!!!