排序算法总结

排序算法说明1)排序的定义:对一序列对象根据某个关键字进行排序;

输入:n个数:a1,a2,a3,...,an
输出:n个数的排列:a1',a2',a3',...,an',使得a1'<=a2'<=a3'<=...<=an'

再讲的形象点就是排排坐,调座位,高的站在后面,矮的站在前面咯。

3)对于评述算法优劣术语的说明

稳定:如果a原本在b前面,而a=b,排序之后a仍然在b的前面;
不稳定:如果a原本在b的前面,而a=b,排序之后a可能会出现在b的后面;

内排序:所有排序操作都在内存中完成;
外排序:由于数据太大,因此把数据放在磁盘中,而排序通过磁盘和内存的数据传输才能进行;

时间复杂度: 一个算法执行所耗费的时间。
空间复杂度: 运行完一个程序所需内存的大小。

关于时间空间复杂度的更多了解请戳这里,或是看书程杰大大编写的《大话数据结构》还是很赞的,通俗易懂。

4)排序算法图片总结(图片来源于网络):

 

 

1.冒泡排序(Bubble Sort)

好的,开始总结第一个排序算法,冒泡排序。我想对于它每个学过C语言的都会了解的吧,这可能是很多人接触的第一个排序算法。

(1)算法描述:冒泡排序是一种简单的排序算法。它重复地走访过要排序的数列,一次比较两个元素,如果它们的顺序错误就把它们交换过来。走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。这个算法的名字由来是因为越小的元素会经由交换慢慢“浮”到数列的顶端。

(2)算法描述和实现   具体算法描述如下:

<1>.比较相邻的元素。如果第一个比第二个大,就交换它们两个;

<2>.对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对,这样在最后的元素应该会是最大的数;

<3>.针对所有的元素重复以上的步骤,除了最后一个;

<4>.重复步骤1~3,直到排序完成。

(3)算法分析;最佳情况:T(n) = O(n)  当输入的数据已经是正序时(都已经是正序了,为毛何必还排序呢....)

最差情况:T(n) = O(n2)  当输入的数据是反序时(卧槽,我直接反序不就完了....)   平均情况:T(n) = O(n2)

#include<stdio.h>

//冒泡排序算法

void bubbleSort(int *arr, int n) {

    for (int i = 0; i<n - 1; i++)

        for (int j = 0; j < n - i - 1; j++)

        {

            //如果前面的数比后面大,进行交换

            if (arr[j] > arr[j + 1]) {

                int temp = arr[j]; arr[j] = arr[j + 1]; arr[j + 1] = temp;

            }

        }

}

int main() {

    int arr[] = { 10,6,5,2,3,8,7,4,9,1 };

    int n = sizeof(arr) / sizeof(int);

    bubbleSort(arr, n);

    printf("排序后的数组为:\n");

    for (int j = 0; j<n; j++)

        printf("%d ", arr[j]);

    printf("\n");

    return 0;

冒泡排序改进1,添加标志位,如果某一次排序中出现没有交换位置,说明排序完成

void maopao(int a[],int n)

{

int flag=0;

for(int i=0;i<n-1;i++)

{    flag=0;

for(int j=0;j<n-i-1;j++)

if(a[j]>a[j+1])

{ int t=a[j];  a[j]=a[j+1];  a[j+1]=t;  flag=1;  }

if(flag==0)

break;

}

}

int main()

{   int n;

cin>>n;

int *a=new int[n];

for(int j=0;j<n;j++)

cin>>a[j];

maopao(a,n);

for(int i=0;i<n;i++)

cout<<a[i];

delete []a;

}

 

 

//冒泡排序改进2,添加标志位,记录最后一次交换位置的地方,证明最后一次交换位置之后的地方时排好序的,下一次只需要排最后一次之前的地方就好了

void maopao(int a[],int n)

{ int flag=n-1;//刚开始,最后交换位置的地方设置为数组的最后一位

while(flag>0)//flag在逐渐减小,到最后肯定会变为0

{ int pos=0;//每一轮的最开始,标志位置在数组0

for(int i=0;i<flag;i++)

if(a[i]>a[i+1])  {    int t=a[i];  a[i]=a[i+1];   a[i+1]=t;   pos=i;  }

flag=pos;

}

}

int main()

{    int n;

cin>>n;

int *a=new int[n];

for(int j=0;j<n;j++)

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值