浅谈简单的5种排序
  TEZNKK3IfmPf 2024年03月29日 114 0

简单的排序有5种:直接插入排序,直接选择排序,冒泡排序,快速排序,归并。

排序的稳定性:比如aa 对应10,bb对应20,cc对应20,dd对应30.

如果对数组降序排序,用稳定的算法排列后的字母顺序应该为dd,bb,cc,aa,而不是dd,cc,bb,aa

直接插入排序:

需要两个数组操作,在一个无序的数组中,按顺序每次选一个数,向另一个数组插入到正确的位置。

这种排序是稳定的。

最差时间复杂度O(n^2).

具体代码如下:

#include<stdio.h>
#include<stdlib.h>
int main(){
int *a;
int n;
printf("输入需要排序的总数:");
scanf("%d",&n);
int i;
a=(int *)malloc(sizeof(int)*(n+1));
printf("输入需要排序的数组:");
for(i=0;i<n;i++)
scanf("%d",&a[i]);
int *b;
b=(int *)malloc(sizeof(int)*(n+1));
int j,m=0;
b[0]=a[0];
for(i=1;i<n;i++,m++)
{
for(j=m;j>=0;j--)
{
if(a[i]>b[j])
{
b[j+1]=b[j];
}else{
break;
}
}
j++
b[j]=a[i];
}
for(i=0;i<n;i++)
printf("%d ",b[i]);
return 0;
}

直接选择排序:

在原有的数组上操作。i=0,在i到n的数组上选择一个最小的数和第i个位置交换,然后i++。

这种排序是不稳定的。

最差时间复杂度O(n^2).

具体代码如下:

#include<stdio.h>
#include<stdlib.h>
int main(){
int *a;
int n;
printf("输入需要排序的总数:");
scanf("%d",&n);
int i;
a=(int *)malloc(sizeof(int)*(n+1));
printf("输入需要排序的数组:");
for(i=0;i<n;i++)
scanf("%d",&a[i]);
int j;
for(i=0;i<n-1;i++)
{
int minj=i,min=a[i];
for(j=i+1;j<n;j++)
{
if(min>a[j])
{
min=a[j];
minj=j;
}
}
int temp;
temp=a[minj];
a[minj]=a[i];
a[i]=temp;
}
for(i=0;i<n-1;i++)
printf("%d ",a[i]);
printf("%d",a[i]);
return 0;
}

冒泡排序:

这种排序应该是初学者的首选了,代码简单,具体过程就不多说。

时间复杂度最差也是O(n^2).

稳定和不稳定的冒泡排序:

#include<stdio.h>
struct stu{
char a[10];
int b;
}str[100];
int main(){
int i,j,n;
scanf("%d",&n);
for(i=0;i<n;i++)
{
scanf("%s%d",str[i].a,&str[i].b);
}
//稳定的冒泡排序
for(i=0;i<n;i++)
for(j=1;j<n-i;j++)
{
if(str[j-1].b<str[j].b)
{
stu t;
t=str[j-1];
str[j-1]=str[j];
str[j]=t;
}
}
//不稳定的冒泡排序
/* for(i=0;i<n-1;i++)
for(j=i+1;j<n;j++)
{
if(str[i].b<str[j].b)
{
stu t;
t=str[i];
str[i]=str[j];
str[j]=t;
}
}*/
for(i=0;i<n;i++)
printf("%s %d\n",str[i].a,str[i].b);
}

归并排序:

归并排序是稳定的排序

时间复杂度恒为O(nlogn)

在之前的已经谈过了,可以看看博主之前那个文章

快速排序:

有两种实现的方法,一种是用sort函数,一种是用递归实现。

sort函数:

在c++里面sort函数的头文件为#include<algorithm>,在c里面也有类似的qsort函数,用法不一样,头文件为include<stdlib.h>。

具体用法在代码里演示:

#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
struct stu{
char m[5];
int n;
}p[5];
bool cmp1(int a,int b)
{
return a>b;
}
bool cmp2(stu a,stu b)
{
if(strcmp(a.m,b.m)<0)
return 1;
else
return 0;
}
bool cmp3(stu a,stu b)
{
return a.n<b.n;
}
bool cmp4(stu a,stu b)
{
if(a.n!=b.n)
return a.n<b.n;
else
return strcmp(a.m,b.m)<0;

}
int main()
{
int a[10]={9,6,1,5,8,3,4,7,2,10};
//非结构体排序
//降序
sort(a,a+10,cmp1);
int i;
printf("降序:\n");
for(i=0;i<10;i++)
printf("%d ",a[i]);
printf("\n\n");
//结构体排序


strcpy(p[0].m,"dddd"),p[0].n=10;
strcpy(p[1].m,"cccc"),p[1].n=10;
strcpy(p[2].m,"aaaa"),p[2].n=20;
strcpy(p[3].m,"bbbb"),p[3].n=50;


sort(p,p+4,cmp2);//按字符串升序
printf("字符串升序:\n");
for(i=0;i<4;i++)
printf("%s %d\n",p[i].m,p[i].n);
printf("\n");


strcpy(p[0].m,"dddd"),p[0].n=10;
strcpy(p[1].m,"cccc"),p[1].n=10;
strcpy(p[2].m,"aaaa"),p[2].n=20;
strcpy(p[3].m,"bbbb"),p[3].n=50;


printf("数字升序:\n");
sort(p,p+4,cmp3);//按数字升序
for(i=0;i<4;i++)
printf("%s %d\n",p[i].m,p[i].n);


strcpy(p[0].m,"dddd"),p[0].n=10;
strcpy(p[1].m,"cccc"),p[1].n=10;
strcpy(p[2].m,"aaaa"),p[2].n=20;
strcpy(p[3].m,"bbbb"),p[3].n=50;


printf("数字升序(若数字一样,按字符串升序):\n");
sort(p,p+4,cmp4);
for(i=0;i<4;i++)
printf("%s %d\n",p[i].m,p[i].n);
}

递归实现:

快排是不稳定的。

时间复杂度最坏O(n^2),最佳情况为O(nlogn)。

具体思想可以参考一个讲的很好而且通俗易懂的博客

#include<stdio.h>
int partition(int a[],int low,int high)
{
int part=a[low];
while(low<high)
{
while(a[high]>part&&low<=high)
high--;
while(a[low]<part&&low<=high)
low++;
int t;
t=a[low];
a[low]=a[high];
a[high]=t;
}
int t;
t=a[low];
a[low]=part;
part=t;
return low;
}
void QuickSort(int a[],int low,int high)
{
if(low<high)
{
int part=partition(a,low,high);
QuickSort(a,low,part-1);
QuickSort(a,part+1,high);
}

int Partition(int A[], int low, int high)
{
int pivot = A[low];
while (low < high)
{
while (low < high && A[high] >= pivot)
--high;

A[low] = A[high]; //将比枢轴值小的元素移到左边

while (low < high && A[low] <= pivot)
++low;

A[high] = A[low]; //将比枢轴值小的元素移到右边
}
A[low] = pivot; //将枢轴值元素置于最终位置
return low;
}

void QuickSort(int A[], int low, int high)
{
if (low < high) //递归跳出条件
{
//Partition就是上面的划分操作
int pivot = Partition(A,low,high); //划分

QuickSort(A,low,pivot-1); //左半部分递归

QuickSort(A, pivot + 1, high); //右半部分递归
}
}*/
int main()
{
int a[10]={6,1,2,7,9,3,4,5,10,8};
QuickSort(a,0,9);
int i;
for(i=0;i<10;i++)
printf("%d ",a[i]);
}
【版权声明】本文内容来自摩杜云社区用户原创、第三方投稿、转载,内容版权归原作者所有。本网站的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@moduyun.com

  1. 分享:
最后一次编辑于 2024年03月29日 0

暂无评论

推荐阅读
  TEZNKK3IfmPf   2024年03月29日   49   0   0 i++
  TEZNKK3IfmPf   2023年11月15日   31   0   0 idei++
  TEZNKK3IfmPf   2023年11月15日   19   0   0 初始化i++
  TEZNKK3IfmPf   2023年11月15日   20   0   0 搜索i++
  TEZNKK3IfmPf   2024年03月29日   115   0   0 i++排序
TEZNKK3IfmPf