C++排序(冒泡排序,插入排序,快速排序,归并排序)

冒泡排序

/*
2,6,4,32,12,9,55,26,37,73,
2,4,6,12,9,32,26,37,55,73,
2,4,6,9,12,26,32,37,55,73,
2,4,6,9,12,26,32,37,55,73,
2,4,6,9,12,26,32,37,55,73,
2,4,6,9,12,26,32,37,55,73,
2,4,6,9,12,26,32,37,55,73,
2,4,6,9,12,26,32,37,55,73,
2,4,6,9,12,26,32,37,55,73,
2,4,6,9,12,26,32,37,55,73,
*/
void sort1()
{
    //冒泡排序 
    int array1[]={55,2,6,4,32,12,9,73,26,37};
    int i,temp;
    for (int pass=1;pass<10;pass++)
    {
        for(i=0;i<10-pass;i++)
        {
            if (array1[i]>array1[i+1])
            {
                temp=array1[i];
                array1[i]=array1[i+1];
                array1[i+1]=temp;
            }            
        }
        for (i=0;i<10;i++)
        {
        cout<<array1[i]<<",";
        }    
        cout<<endl;
    }
    for (i=0;i<10;i++)
    {
        cout<<array1[i]<<",";
    }    
    return;
}

插入排序

/*
2,55,|6,4,32,12,9,73,26,37,
2,6,55,|4,32,12,9,73,26,37,
2,4,6,55,|32,12,9,73,26,37,
2,4,6,32,55,|12,9,73,26,37,
2,4,6,12,32,55,|9,73,26,37,
2,4,6,9,12,32,55,|73,26,37,
2,4,6,9,12,32,55,73,|26,37,
2,4,6,9,12,26,32,55,73,|37,
2,4,6,9,12,26,32,37,55,73,|
2,4,6,9,12,26,32,37,55,73,
*/
void sort2()
{
    //插入排序    
    int array1[]={55,2,6,4,32,12,9,73,26,37};
    int inserter,index;    
    for (int i=1;i<10;i++)
    {
        inserter=array1[i];
        index=i-1;
        while (index>=0&&(inserter<array1[index]))
        {
            array1[index+1]=array1[index];
            index--;
        }
        array1[index+1]=inserter;
        for (int j=0;j<10;j++)
        {
            cout<<array1[j]<<",";
            if (j==i)
            {
                cout<<'|';
            }            
        }    
        cout<<endl;
            
    }
    for (int i=0;i<10;i++)
    {
        cout<<array1[i]<<",";
    }    
    return;     
}

快速排序

/*
55,2,6,4,32,12,9,73,26,37,
26,2,6,4,32,12,9,73,
26,2,6,4,32,12,9,
4,2,6,
4,2,
2,4,6,9,32,12,26,
37,4,6,9,12,26,32,
26,4,6,9,12,
9,4,6,
4,6,9,12,26,32,37,2,73,55,
4,6,9,12,26,32,37,2,55,73,
*/
void swap(int& a,int& b)
{
    int t=a;
    a=b;
    b=t;
}
void showarray(int a[],int len) 
{
    for (int i=0;i<len;i++)
    {
        cout<<a[i]<<",";
    }
    cout<<endl;
}

void qsort(int a[],int left,int right)
{
    //showarray(a,right+1);
    int pivot=a[right],l=left,r=right;
    while (l<r)
    {
        swap(a[l],a[r]);
        /*
        int t=a[l];
        a[l]=a[r];
        a[r]=t;
        */
        //showarray(a,r);
        while (l<r&&(a[r]>pivot))
        {
            --r;
        }        
        while (l<r&&(a[l]<=pivot))
        {
            ++l;
        }
        swap(a[left],a[r]);
        /*
        t=a[left];
        a[left]=a[r];
        a[r]=t;
        */
        if (left<r-1)
        {
            qsort(a,left,r-1);
        }
        if (r+1<right)
        {
            qsort(a,r+1,right);
        }
        
    }
    
}

//https://www.cnblogs.com/nicaicai/p/12689403.html
void sort3()
{
    //快速排序
    int array1[]={55,2,6,4,32,12,9,73,26,37};
    int len=sizeof(array1)/sizeof(int);
    for (int i=0;i<len;i++)
    {
        qsort(array1,0,len-1);
    }    
    //showarray(array1,len);
    for (int i=0;i<len;i++)
    {
        cout<<array1[i]<<",";
    }
    return;
}

 归并排序  数列(42,15,20,6,8,38,50,12)

#include <stdio.h>
#include <iostream>
#include <algorithm>
#include <cstdlib>
#include <cmath>
using namespace std;

/* run this program using the console pauser or add your own getch, system("pause") or input loop */
void merge(int* a, int low, int mid, int hight)  //合并函数
{
    int* b = new int[hight - low + 1];  //用 new 申请一个辅助函数
    int i = low, j = mid + 1, k = 0;    // k为 b 数组的小标
    while (i <= mid && j <= hight)  
    {
        if (a[i] <= a[j])
        {
            b[k++] = a[i++];  //按从小到大存放在 b 数组里面
        }
        else
        {
            b[k++] = a[j++];
        }
    }
    while (i <= mid)  // j 序列结束,将剩余的 i 序列补充在 b 数组中 
    {
        b[k++] = a[i++];
    }
    while (j <= hight)// i 序列结束,将剩余的 j 序列补充在 b 数组中 
    {
        b[k++] = a[j++];
    }
    k = 0;  //从小标为 0 开始传送
    for (int i = low; i <= hight; i++)  //将 b 数组的值传递给数组 a
    {
        a[i] = b[k++];
    }
    delete[]b;     // 辅助数组用完后,将其的空间进行释放(销毁)
}
void mergesort(int* a, int low, int hight) //归并排序
{
    if (low < hight)
    {
        int mid = (low + hight) / 2;
        mergesort(a, low, mid);          //对 a[low,mid]进行排序
        mergesort(a, mid + 1, hight);    //对 a[mid+1,hight]进行排序
        merge(a, low, mid, hight);       //进行合并操作
    }
}


void f1()
{
    //归并排序
    /*
      归并排序是比较稳定的排序方法。它的基本思想是把待排序的元素分解成两个规模大致相等的子序列。
      如果不易分解,将得到的子序列继续分解,直到子序列中包含的元素个数为1。
      因为单个元素的序列本身就是有序的,此时便可以进行合并,从而得到一个完整的有序序列。
    */ 
    //步骤一:首先将待排序的元素分成大小大致相同的两个序列。
    //步骤二:再把子序列分成大小大致相同的两个子序列。
    //步骤三:如此下去,直到分解成一个元素停止,这时含有一个元素的子序列都是有序的。
    //步骤四:进行合并操作,将两个有序的子序列合并为一个有序序列,如此下去,直到所有的元素都合并为一个有序序列。
    int n, a[100];
    cout << "请输入数列中的元素个数 n 为:" << endl;
    cin >> n;
    cout << "请依次输入数列中的元素:" << endl;
    for (int i = 0; i < n; i++)
    {
        cin >> a[i];
    }
    mergesort(a, 0, n-1);
    cout << "归并排序结果" << endl;
    for (int i = 0; i < n; i++)
    {
        cout << a[i] << " ";
    }
    cout << endl;     
}
int main(int argc, char** argv) {
    f1();
    return 0;
}

 

posted @ 2022-12-02 14:16  jhtchina  阅读(33)  评论(0)    收藏  举报