各种排序算法的空间复杂度:
简单选择排序
动图演示:
C语言代码:
#include<stdio.h>
void Swap(int *a ,int * b){ //使用指针地址引用,永久的改变值的位置
int t = *a; *a = *b ;*b = t;
}
//N:数组的长度
void SimpleSelectSort(int A[],int N){
int i,j,min;
for(i = 0;i<N-1;i++){
min = i;
for(j = i+1;j<N;j++){ //寻第i组找最小元素
if(A[j]<A[min])
min = j; //min记录最小元素位置
}
Swap(&A[i],&A[min]); //将第i个元素与最小元素交换
}
}
int main(void){
// 简单选择排序:
int B[7] = {2,3,4,5,6,1,9};
SimpleSelectSort(B,7);
for(int i = 0;i<7;i++){
printf("%d\n",B[i]);
}
return 0;
}
简单插入排序
动图演示:
C语言代码:
void InsertSort(int A[],int N){
//简单插入排序
int p,i;
int Tmp;
for(p = 1;p<N;p++){
Tmp = A[p]; //取出未排序序列中的第一个元素
for(i = p;i>0&& A[i-1]>Tmp;i--)
A[i] = A[i-1]; //因为是向后移动,所以直接一步覆盖就可以了
A[i] = Tmp; //放进合适的位置
}
}
int main(void){
int B[7] = {2,3,4,5,6,1,9};
InsertSort(B,7);
for(int i = 0;i<7;i++){
printf("%d\n",B[i]);
}
return 0;
}
冒泡排序(简单交换排序)
动图演示:
C语言代码:
void Swap(int *a ,int * b){ //使用指针地址引用,永久的改变值的位置
int t = *a; *a = *b ;*b = t;
}
void BubbleSort(int A[],int N){
int P,i;
bool flag;
for(P = N-1;P>0;P--){
flag = false; //标记盖茨循环中是否发生交换。若无,则说明整个序列有序
for(i = 0;i<P;i++) { //一趟冒泡
if(A[i]>A[i+1]){
Swap(&A[i],&A[i+1]);
flag = true; //表示发生了交换
}
}
if(flag == false)break; //若全程无交换,则跳出循环
}
}
int main(void){
int B[7] = {2,3,4,5,6,1,9};
BubbleSort(B,7);
for(int i = 0;i<7;i++){
printf("%d\n",B[i]);
}
return 0;
}