常见排序(一)

主函数

int main(){

    int a[] = {100, 5, 3, 1, 8, 7, 2, 4};
    int n = sizeof(a)/sizeof(int);
    cout << "原数组为:";
    for (int i = 0; i < n; i++)
        cout << a[i];
    //Bubblesort(a,n);
    //cocktailsort(a,n);
    //choosesort(a,n);
    //insertsort(a,n);
    Binarysort(a, n);
    return 0;
}
#include<iostream>
using namespace std;
void swap(int &a, int &b){
    int temp;
    temp = b;
    b = a;
    a = temp;
}


//冒泡排序

void Bubblesort(int *a,int n){
     //冒泡排序主要是相邻比较将最大(或最小)移到一边
    //最大的数排至最右边即从小到大
    for (int i = 0; i < n - 1;i++)//需要n-1轮
    for (int j = 0; j < n - i - 1; j++)
    {
        if (a[j]>a[j + 1])
            swap(a[j],a[j+1]);
    }
    cout << "冒泡排序后的序列为:";
    for (int k = 0; k < n; k++)
        cout << a[k];

}


//冒泡法改进:鸡尾酒排序:向右将最大的数冒出,向左将最小的数冒出

void cocktailsort(int *a,int n){
    int k = 0;
    int i = 900;
    int j = 0;
    while (i-j>1){
        for (i = k; i < n-k; i++)
        {
            if (a[i]>a[i + 1])
                swap(a[i], a[i + 1]);
        }
        for (j = n -k-1; j >= k; j--)
        {
            if (a[j] < a[j - 1])
                swap(a[j],a[j-1]);
        }
        k++;
    }
    cout << "鸡尾酒排序后的序列为:";
    for (int i = 0; i < n; i++)
        cout << a[i];
}


//选择排序:找最大或者最小放到最左或者最右,重复N-1次即可把n个数排序
//这里把最大的数放最右边

void choosesort(int *a,int n){
    int temp=0;
    int i, j;
    for (i = 0; i < n-1; a[n - 1 - i] = temp,i++)
    for (j = 0; j < n-i-1; j++)
    {
        if (a[j]>a[j + 1])
            temp = a[j];
        else
            temp = a[j + 1];
    }
    cout << "选择排序后的序列为:";
    for (int i = 0; i < n; i++)
        cout << a[i];
}


//插入排序:插入排序主要是将无序数与有序队列比较,选择合适位置插入

void insertsort(int *a,int n){
    //第一个数开始为有序队列,后的数为无序队列,这里按照从小到大排列
    int temp=0;
    int j = 0;
    for (int i = 1; i < n; i++)
    {
        temp = a[i];
        j = i;
        while (temp < a[j - 1] && j >= 0)
        {
            swap(temp, a[j - 1]);
            temp = a[j - 1];
            j--;
        }

    }
    cout << "插入排序后的序列为:";
    for (int i = 0; i < n; i++)
        cout << a[i];
}


//插入排序改进:二分插入排序
//适用于数比较多的情况,此时比较次数比较多,二分插入不用一个一个的比较,而是不断的用二分法确定无序数的区间范围

void Binarysort(int *a,int n){
    int i, j, low, high, mid;
    int temp;
    for (i = 1; i <n; i++)
    {
        temp = a[i];
        low = 0;
        high = i - 1;
        while (low <= high)
        {
            mid = (low+high) / 2;
            if (temp < a[mid])
                high = mid - 1;
            else
                low = mid + 1;

        }
        for (j = i - 1; j >= low;j--)
            a[j + 1] = a[j];
        a[low] = temp;

    }

    
    cout << "二分插入排序后的序列为:";
    for (int i = 0; i < n; i++)
        cout << a[i];
}


//shell排序,插入排序的更高改进,又叫缩小增量排序法



 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值