算法复习——排序问题

一、选择排序

基本思想:

设 A[1..n]为包含n个元素的数组。

首先,我们找到数组中的最小元素,将它存在A[1]。

接着,我们从剩下的n-1个元素中找到最小的元素,将它存在 A[2]。

重复以上过程,直到整个数组中第二大的元素存在A[n-1],则算法停止。

用动图来表示以下过程:

选择排序法

 稳定性:不稳定。

时间复杂度:O(n2)

适用于元素个数较少的排序。

伪代码如下:

input:包含n个元素的数组A[1...n]
output:从小到大排序的数组A[1...n]
1、for i <- 1 to n-1
2、    k <- i
3、    for j <- i to n-1
4、        if A[j] < A [k] then k <- j
5、    end for  
6、    if k != i then 交换 A[i] and A[k]
7、end for

代码如下:

void sort (int a[], int n)
{
    int k=0;
    int temp=0;
    for(int i=1;i<n;i++)
    {
        k=i;
        for(int j=i+1;j<n;j++)
        {
            if(a[j]<a[k])
                k=j;
        }
        if(k!=i)
        {
            temp=a[k];
            a[k]=a[i];
            a[i]=a[k];
        }
    }
}

二、插入排序

基本思想:

从只包含一个元素的子数组A[1]开始,

接着,将元素A[2]插入到子数组A[1]的合适的位置,这个位置可能在A[1]之前或者A[1]之后,那么A[1..2] 变为有序的子数组然后,插入A[3]、A[4],直到所有的元素都插入,整个数组变为有序。

伪代码如下:

Input: An array A [1..n] of n elements.
Output: A [1..n] sorted in nondecreasing order.
    1.for i <- 2 to n
    2.  x <- A[i]
    3.   j <- i-1
    4.  while (j>0) and (A[j]>x)
    5.     A[j+1] <- A[j]
    6.     j <- j-1
    7.   end while
    8.  A[j+1]=x
    9.end for
void insertsort(int a[],int n)
{
    int t;
    for(int i=1;i<n;i++)
    {
        t=a[i];
        if(a[i]<a[i-1])
        {
            for(int j=i-1;t<a[j];j--)
            {
                a[j+1]=a[j];
            }
            a[j+1]=t;
        }
    }
}

三、快速排序

代码如下:

#include <bits/stdc++.h>
using namespace std;
void quicksort(int left,int right)
{
    int i,j;
    int t=a[left];
    if(left>right) return;
    i=left;
    j=right;
    while(i!=j)
    {
        while(a[j]>=t&&i<j) j--;
        while(a[i]<=t&&i<j) i++;
        if(i<j)
        {

        }
    }
    a[left]=a[i];
    a[i]=t;
    qs(left,i-1);
    qs(i+1,right);
    return;
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值