首页 > 代码库 > 总结一下常用的排序

总结一下常用的排序

最近学习了几种排序,想要记录下来

 

(一)冒泡排序:

#include<cstdio>
#include<cstring>
#define Max 1001
using namespace std;

int main()
{
int A[Max]={10,43,48,1,8,3,5,7,1,-21},t;
for(int i=0;i<10-1;i++)
for(int j=0;j<10-i-1;j++) //因为后面j加1,所以先要减1
if(A[j]>A[j+1]) //前面的数与后面的数比较大小
{
t=A[j];
A[j]=A[j+1];
A[j+1]=t;
}


for(int i=0;i<10;i++)
printf("%d ",A[i]);
return 0;
}

总结:冒泡排序是一种用时间换空间的排序方法,时间复杂度为O(N^2)。

 

(二)选择排序:

#include<cstdio>
#include<cstring>
#define Max 1001
using namespace std;

int main()
{
int A[Max]={10,43,48,1,8,3,5,7,1,-21},t,min;
for(int i=0;i<10-1;i++)
{
int index=i;
min=A[i];
for(int j=i+1;j<10;j++)
if(min>A[j])
{
min=A[j];
index=j;
}
t=A[i];
A[i]=min;
A[index]=t;
}


for(int i=0;i<10;i++)
printf("%d ",A[i]);
return 0;
}

总结:选择排序的平均时间复杂度为O(N^2)。

注:以上两种排序方法因为随机复杂度打,所以现在很少使用。

 

(三)快速排序:

#include<cstdio>
#include<cstring>
#define Max 1001
using namespace std;

void QSort(int left,int right,int *A)
{
if(left>right)return;
int i=left;
int j=right;
int key=A[left];
while(i<j)
{
while(i<j&&key<=A[j])j--;  
A[i]=A[j];
while(i<j&&key>=A[i])i++;
A[j]=A[i];
}
A[i]=key;
QSort(left,i-1,A);
QSort(i+1,right,A);
}

int main()
{
int A[Max]={10,43,48,1,8,3,5,7,1,-21};

QSort(0,9,A);

for(int i=0;i<10;i++)
printf("%d ",A[i]);
return 0;
}

总结:快速排序的时间复杂度为O(N),也是我最喜欢用的一种排序方法。

 

以上有什么错误还望指出,希望我们共同学习。

 

总结一下常用的排序