排序-冒泡,归并,快排区别

快排:

#include <iostream>
#include <string.h>
#include <stdio.h>
#include <cmath>
using namespace std;
void Q_Sort(int a[],int low,int high)
{
    if(low >= high) return;
    int first = low;
    int last = high;
    int key = a[first];
    while(first < last)
    {
        while(first < last && a[last] >= key)
        {
            last--;
        }
        a[first] = a[last];
        while(first < last && a[first] <= key)
        {
            first++;
        }
        a[last] = a[first];
    }
    a[first] = key;
    Q_Sort(a,low,last);
    Q_Sort(a,last+1,high);
}
int n = 9;
int a[] = {57, 68, 59, 52, 72, 28, 96, 33, 24};
void print()
{
    for(int i=0;i<n;i++)
    {
        printf("%d ",a[i]);
    }
    printf("\n");
}
int main()
{
    print();
    Q_Sort(a,0,8);
    print();
    return 0;
}

快排:在当前要排序的数组中,选取一个数为基准,然后将数组分成两部分,一部分是比当前数小,另外一部分比此基准大,然后分治递归相同的操作,快排的最坏的时间复杂度是最坏时间为O(n2),平均时间复杂度是O(nlgn)。

归并排序:

#include <iostream>
#include <string.h>
#include <stdio.h>
using namespace std;
#define maxn 1100
int mmap[maxn];
void Merge(int num[],int first,int mid,int last)
{
    int i=first;
    int j = mid+1;
    int Index = 0;
    while(i<=mid && j <= last)
    {
        if(num[i] <= num[j])
        {
            mmap[Index++] = num[i++];
        }
        else
        {
            mmap[Index++] = num[j++];
        }
    }
    while(i<=mid)
    {
        mmap[Index++] = num[i++];
    }
    while(j <= last)
    {
        mmap[Index++] = num[j++];
    }
    for(int m=0;m<Index;m++)
    {
        num[first++] = mmap[m];
    }
}
void MergeSort(int num[],int first,int last)
{
    if(first == last)
    {
        return;
    }
    int mid = (first + last)/2;
    MergeSort(num,first,mid);
    MergeSort(num,mid+1,last);
    Merge(num,first,mid,last);
}
int num[maxn];
int main()
{
    int n;
    cin>>n;
    for(int i=0;i<n;i++)
    {
        cin>>num[i];
    }
    MergeSort(num,0,n-1);
    for(int i=0;i<n;i++)
    {
        printf("%d ",num[i]);
    }
    printf("\n");
    return 0;
}

归并排序:是根据分治的思想,想将数据分成两段,然后以此递归,然后再合并

时间复杂度是:O(nlgn)

冒泡排序:

#include <iostream>
#include <string.h>
#include <stdio.h>
using namespace std;
#define maxn 1100
int mmap[maxn];
int n;
void Bubble_Sort()
{
    int temp;
    bool flag;
    for(int i=0;i<n-1;i++)
    {
        flag = 0;
        for(int j=n-2;j>=i;j--)
        {
            if(mmap[j] > mmap[j+1])
            {
                temp = mmap[j+1];
                mmap[j+1] = mmap[j];
                mmap[j] = temp;
                flag = 1;
            }
        }
        if(!flag) break;
    }
}
int main()
{
    while(~scanf("%d",&n))
    {
        for(int i=0;i<n;i++)
        {
            scanf("%d",&mmap[i]);
        }
        Bubble_Sort();
        for(int i=0;i<n;i++)
        {
            printf("%d ",mmap[i]);
        }
        printf("\n");
    }
    return 0;
}

冒泡排序:将数组中的两个元素进行比较,然后找到最大的放到最后,然后以此来循环

时间复杂度是:O(n2)

时间: 2024-10-01 04:20:43

排序-冒泡,归并,快排区别的相关文章

排序算法-冒泡——插入——快排

冒泡排序,往两个方向泡,一个往小泡,一个网大泡 #include<stdio.h> #include<stdlib.h> #include<time.h> void bubble_sort(int *a,int n){ int temp; for(int i=0;i<n;i++) for(int j=0;j<n-i-1;j++){ if(a[j]>a[j+1]){ temp=a[j]; a[j]=a[j+1]; a[j+1]=temp; } } } v

Python实现排序(冒泡、快排、归并)

Thomas H.Cormen 的<算法导论>上介绍的几个经典排序算法的Python实现. 1.冒泡排序: 简单的两重循环遍历,使最小(最大)的值不断地往上升(下沉)而实现的排序,算法时间为O(n2). 代码如下: 1 def up_sort(a): 2 # 冒泡排序 3 4 a_length = len(a) 5 while True: 6 i = 0 7 j = 1 8 9 while True: 10 if a[i] > a[j]: 11 a[i], a[j] = a[j], a[

Java常见的几种排序算法-插入、选择、冒泡、快排、堆排等

本文就是介绍一些常见的排序算法.排序是一个非常常见的应用场景,很多时候,我们需要根据自己需要排序的数据类型,来自定义排序算法,但是,在这里,我们只介绍这些基础排序算法,包括:插入排序.选择排序.冒泡排序.快速排序(重点).堆排序.归并排序等等.看下图: 给定数组:int data[] = {9,2,7,19,100,97,63,208,55,78} 一.直接插入排序(内部排序.O(n2).稳定) 原理:从待排序的数中选出一个来,插入到前面的合适位置. [java] view plain copy

排序---内部排序算法(快排、希尔排序、归并排序、基数排序、冒泡、选择排序)比较

1.内部排序的复杂度总结 1)时间复杂度 4种排序的平均时间复杂度是O(nlog2n),"快些以nlog2n的速度归队"(快排.希尔排序.归并.堆排序) 最坏情况下,快排的时间复杂度为O(n*n) 2)空间复杂度 O(log2n)快排 O(n)归并 O(rd)基数 其他都是O(1) 3)稳定性 不稳定的:"考研复习痛苦啊,情绪不稳定,快些选一堆好友来聊天吧"(快排.希尔.简单选择排序.堆排序) 其他都是稳定的. 4)一趟排序,保证一个关键字到达最终位置 交换类(起泡

排序算法的简单实现(冒泡和快排)

排序算法 冒泡排序 原理:把相邻的元素两两比较,根据大小来交换元素的位置. 原始的冒泡排序是稳定排序.由于该排序的每一轮要遍历所以元素,轮转的次数和元素数量相当,所以时间复杂度是 O(N^2). java代码表达如下: import java.util.Arrays; public class BubbleSort{ private static void sort(int array[]){ int tmp = 0; for (int i = 0; i < array.length; i++)

常见的几种排序算法-插入、选择、冒泡、快排、堆排等

排序是一个非常常见的应用场景,很多时候,我们需要根据自己需要排序的数据类型,来自定义排序算法,但是,在这里,我们只介绍这些基础排序算法,包括:插入排序.选择排序.冒泡排序.快速排序(重点).堆排序.归并排序等等.看下图: 给定数组:int data[] = {9,2,7,19,100,97,63,208,55,78} 一.直接插入排序(内部排序.O(n2).稳定) 原理:从待排序的数中选出一个来,插入到前面的合适位置. package com.xtfggef.algo.sort; public

Java实现的各种排序算法(包括冒泡,快排等)

//堆排序 不稳定 import java.util.Arrays; public class HeapSort { public static void main(String[] args) { int[] a={49,38,65,97,76,13,27,49,78,34,12,64}; int arrayLength=a.length; //循环建堆 for(int i=0;i<arrayLength-1;i++){ //建堆 buildMaxHeap(a,arrayLength-1-i)

C语言实现单向链表及其各种排序(含快排,选择,插入,冒泡)

#include<stdio.h> #include<malloc.h> #define LEN sizeof(struct Student) struct Student //结构体声明 { long num; int score; struct Student* next; }; int n; struct Student* creat() //创建单向链表 { struct Student *head=NULL, *p_before, *p_later; p_before =

冒泡,快排代码+注释

冒泡: package Sort; public class BubbleSort { public static void main(String[] args) { int[] list = new int[]{12,14,3,24,1,33}; int[] nums = bubbleSort(list); for(int i = 0;i< list.length;i++){ System.out.println(nums[i]); } } public static int[] bubbl