一些数组排序算法的简单实现(冒泡、插入、希尔、归并和qsort)

#include <stdlib.h>
#include <string.h>
#include "sort.h"

//冒泡排序
int bubbleSort(int a[], int n)
{
    int i, j;
    for (i=n-1; i>=0; i--)
    {
        for (j=0; j<i; j++)
        {
            if (a[j]>a[j+1])
            {//交换a[i]和a[j],也可使用临时变量实现
                a[j] += a[j+1];
                a[j+1] = a[j] - a[j+1];
                a[j] = a[j] - a[j+1];
            }
        }
    }
    return 0;
}

/***********编译器自带快排************/
int cmp(const void * a, const void * b)
{
    return *(int *)a - *(int *)b;
}

int quickSortC(int a[], int n)
{
    qsort(a, n, sizeof(a[0]), cmp);
    return 0;
}
/***********编译器自带快排************/

//直接插入排序
int insertSort(int a[], int n)
{
    int i, j, k, tmp;
    for (i=1; i<n; i++)
    {
        for (j=0; j<i; j++)
        {
            if (a[i]<a[j])//insert a[i] before a[j]
            {
                tmp = a[i];
                for (k=i; k>j; k--)
                {
                    a[k] = a[k-1];
                }
                a[j] = tmp;
            }
        }
    }
    return 0;
}

//希尔排序(无监视哨,迭代,也可递归实现)
int shellSort(int a[], int n)
{
    int i, j, k, tmp, group = 0, step = n/2;
    while (step > 0)
    {
        for (i=group+step; i<n; i+=step)
        {
            tmp = a[i];
            for (j=group; j<i; j+=step)
            {
                if (a[j]>a[i])
                {
                    for (k=i; k>j; k-=step)
                    {
                        a[k] = a[k-step];
                    }
                    a[j] = tmp;
                }
            }
        }
        step /= 2;
    }
    return 0;
}

/*
归并排序,鼓捣了半天,还是写成两个子函数的明了
*/
int merge(int a[], int m, int b[], int n, int arr[])
{
    int i=0, j=0, k=0;
    while (i<m && j<n)
    {
        arr[k++] = a[i]<b[j] ? a[i++] : b[j++];
    }
    if (i<m)
    {
        memcpy(&arr[k], &a[i], (m-i)*sizeof(int));
    }
    else if(j<n)
    {
        memcpy(&arr[k], &b[j], (n-j)*sizeof(int));
    }
    return 0;
}

int mergeSort(int a[], int len)
{
    int i, j, k=0, step, g1, g2, m, n;
    int * arr = (int *)malloc(sizeof(int)*len);

    for (step=1; step<=len; step<<=1)
    {//
        g1 = 0;
        g2 = g1 + step;
        k = 0;
        memcpy(arr, a, len*sizeof(int));
        for (i=g1,j=g2; g1<len; g1=g2+step, g2=g1+step)
        {
            //先处理不足两组的情况,即g2>=len的情况
            m = g2<len ? step : len-g1;
            n = g2+step<len ? step : len-g2;
            if (g2>=len)//剩余末尾分组
            {
                memcpy(&a[k], &arr[g1], m*sizeof(int));
                k += m;
                break;
            }
            if(merge(&arr[g1], m, &arr[g2], n, &a[k]))
            {
                free(arr);
                return 1;
            }
            k += m+n;
        }
    }
    free(arr);
    return 0;
}
时间: 2024-10-03 16:13:31

一些数组排序算法的简单实现(冒泡、插入、希尔、归并和qsort)的相关文章

冒泡---插入---希尔排序

<span style="color:#ff0000;">#include<iostream> using namespace std; #define MAXSIZE 21 typedef int SqList[MAXSIZE]; #define ElementType int void Swap(int &a, int &b) { a = a^b; b = a^b; a = a^b; } ///////////////////////////

冒泡选择插入希尔归并快速排序等python实现

def bubble_sort(a_list): for pass_num in range(len(a_list) - 1, 0, -1): for i in range(pass_num): if a_list[i] > a_list[i + 1]: a_list[i], a_list[i + 1] = a_list[i + 1], a_list[i] def short_bubble_sort(a_list): exchanges = True pass_num = len(a_list)

八大内部排序算法(上)-冒泡、直接插入、简单选择、快速

八大内部排序算法(上)冒泡.直接插入.简单选择.快速 排序分为内部排序和外部排序,内部排序是数据记录在内存中进行排序,而外部排序是因排序的数据很大,一次不能容纳全部的排序记录,在排序过程中需要访问外存. 我们这里说说八大排序就是内部排序. 1.直接插入排序 将一个记录插入到已排序好的有序表中,从而得到一个新,记录数增1的有序表.即:先将序列的第1个记录看成是一个有序的子序列,然后从第2个记录逐个进行插入,直至整个序列有序为止. 要点:设立哨兵,作为临时存储和判断数组边界之用. 直接插入实现如下:

1. 算法 -- 排序(插入,冒泡,希尔,快速,选择)

1.  插入排序===================================================== 算法思想简单描述: 在要排序的一组数中,假设前面(n-1) [n>=2] 个数已经是排好顺序的,现在要把第n个数插到前面的有序数中,使得这n个数也是排好顺序的.如此反复循环,直到全部排好顺序. 直接插入排序是稳定的.算法时间复杂度O(n2)--[n的平方] 一般来说,插入排序都采用in-place在数组上实现.具体算法描述如下:1.从第一个元素开始,该元素可以认为已经被排序

基础排序算法—冒泡,插入,选择

前言 冒泡,插入,选择这三种基础的排序算法,比较简单效率不高,工作中一般不会使用,但是当做算法来研究还是能了解一些知识的,本文以<数据结构与算法之美>为基础,详细解析一下. 正文 首先要引入几个概念 稳定性 如果待排序数组中有相同的元素,排序过后它们的相对顺序不发生变化. 比如 2,9,3,4,8,3 排序过后为2, 3 , 3, 4, 8, 9 这两个3的相对顺序不变.这样就是具有稳定性. 稳定性可以保证复杂数据结构排序时的相对有序性. 比如我们要对一笔订单先按金额排列,金额相同的再按时间排

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

冒泡排序,往两个方向泡,一个往小泡,一个网大泡 #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

简单排序:插入,选择和冒泡

void selectsort(int a[],int n) // 选择排序的思路就是每次找到当前序列中最小的元素,然后交换 { // 就是选择最小的,然后交换 int i,j,flag; for(i = 0;i<n;i++) { flag = i; //当前元素 for(j = i+1;j<n;j++) { if(a[j]<a[flag]) flag = j; //在剩下未排序的数组中找到最小元素的下标 } int temp = a[i]; //交换当前元素和最小元素. a[i] =

排序算法-冒泡、插入、归并、希尔、快速、选择--代码总结

冒泡排序代码: #include <iostream> #include <string> using namespace std; template<class ItemType> void bubbleSort(ItemType theArray[], int n) { bool sorted = false; // False when swaps occur int pass = 1; while (!sorted && (pass < n

排序算法(三)冒泡、选择排序的Python实现及算法优化详解

说在前面 最近一年太忙,博客长草了.近日用Python实现了常用排序算法,供大家参考. Java版本排序算法及优化,请看以前的文章. <排序算法之简单排序(冒泡.选择.插入)> <排序算法(二)堆排序> 1.排序概念 这里不再赘述,请参看前面2篇文章 2.简单排序之冒泡法Python实现及优化 原理图 2.1.基本实现 num_list = [     [1, 9, 8, 5, 6, 7, 4, 3, 2],     [1, 2, 3, 4, 5, 6, 7, 8, 9] ] nu