美文网首页
冒泡排序、快速排序、二分插入排序c++实现

冒泡排序、快速排序、二分插入排序c++实现

作者: 银角代王 | 来源:发表于2017-11-28 19:13 被阅读0次

先奉上一段in-place交换的方法

//in-place swap
void swap_int(int& a, int& b)
{
    a = a ^ b;
    b = a ^ b;
    a = a ^ b;
}
冒泡排序实现
/*
 * 交换排序之冒泡排序
 * 相邻元素比较大小,将大值交换到后面的位置
 * 优化:不需要与后面已经排好序的元素比较
 *       如果发现一趟比较中没有位置交换,说明排序已经完成
 */
void BubbleSort(int a[], int len)
{
    bool swaped = false;
    for (int i = 0; i < len; ++i)
    {
        for (int j = 1; j < len - i; ++j)
        {
            if (a[j - 1] > a[j])
            {
                swap_int(a[j - 1], a[j]);
                swaped = true;
            }
        }

        if (!swaped) break;
    }
}
快速排序实现
/*
 * 交换排序之快速排序
 * 选用一个值作为比较对象,大值交换到右侧位置,小值交换到左侧位置,递归此操作
 */
void QuickSort(int s[], int left, int right)
{
    if (left < right)
    {
        int i = left, j = right, x = s[left];
        while (i < j)
        {
            while (i < j && s[j] >= x) // 从右向左找第一个小于x的数  
                j--;
            if (i < j)
                s[i++] = s[j];
            print_arr(s, SIZE);
            while (i < j && s[i]< x) // 从左向右找第一个大于等于x的数  
                i++;
            if (i < j)
                s[j--] = s[i];
            print_arr(s, SIZE);
        }
        s[i] = x;
        QuickSort(s, left, i - 1); // 递归调用  
        QuickSort(s, i + 1, right);
    }
}
二分插入排序
/*
 * 插入排序之二分查找法排序
 * 使用二分查找法搜索新元素在已排列好的元素中的插入位置并插入,插入位置后的元素逐个后移
 */
int SearchBinary(int a[], int value, int left_index, int right_index)
{
    if (right_index <= left_index) 
        return a[left_index] < value ? left_index+1:left_index;

    int mid = (right_index + left_index) / 2;
    if (value == a[mid]) 
        return mid + 1;

    if (value > a[mid]) 
        return SearchBinary(a, value, mid + 1, right_index);

    return SearchBinary(a, value, left_index, mid - 1);
}

void InsertSort(int a[], int len)
{
    for (int i = 1; i<len; ++i)
    {
        if (a[i] < a[i - 1])
        {
            int index = SearchBinary(a, a[i], 0, i - 1);
            int tmp = a[i];
            for (int j = i; j>index; --j)
            {
                a[j] = a[j - 1];
            }
            a[index] = tmp;
        }
    }
}

相关文章

  • 基本算法

    冒泡排序、插入排序、选择排序、快速排序、二分查找(Objective-C实现)

  • 排序(新排版)

    冒泡排序 插入排序 二分插入排序 希尔排序 选择排序 快速排序

  • 常见排序的java实现

    常见排序的java实现 常见排序java实现 插入排序(二分插入排序) 希尔排序 快速排序(三数中值快排) 冒泡排...

  • 排序算法

    冒泡排序 选择排序 插入排序二分插入排序希尔排序 堆排序 归并排序 快速排序 交换排序类:冒泡排序快速排序 选择排...

  • 冒泡排序、快速排序、二分插入排序c++实现

    先奉上一段in-place交换的方法 冒泡排序实现 快速排序实现 二分插入排序

  • Datawhale | 编程第6期 Test 3

    排序 1.实现归并排序、快速排序、插入排序、冒泡排序、选择排序、堆排序(选做) 归并排序 快速排序 插入排序 冒泡...

  • 排序算法

    冒泡排序 堆排序 插入排序 二分法查找插入排序 希尔排序 快速排序 归并排序

  • 排序算法

    直接插入排序 二分插入排序 希尔排序 冒泡排序 快速排序 归并排序 堆排序

  • 基础排序算法

    快速排序 二分查找 冒泡排序 归并算法 选择排序 插入排序 Shell排序

  • JS算法笔记 - 排序

    冒泡排序 改进冒泡排序 选择排序 快速排序 在JS中相对较快 插入排序 改进:二分插入排序 希尔排序 动态定义间隔...

网友评论

      本文标题:冒泡排序、快速排序、二分插入排序c++实现

      本文链接:https://www.haomeiwen.com/subject/vxwebxtx.html