数据结构考试排序算法总结

随声附和 提交于 2019-12-22 01:41:39

直插排序

void insertsort(int *a, int n)//升序
{
    for(int i = 1, j; i < n; i++)
    {
        int tem = a[i];
        for(j = i - 1; j >= 0; j--)
            if(a[j] > tem)
                a[j + 1] = a[j];
            else
                break;
        a[j + 1] = tem;
        //print(a, n);
    }
}

希尔排序

void shellsort(int *a, int n)//降序
{
    for(int gap = n / 2; gap >= 1; gap /= 2)
    {
        for(int i = gap, j; i < n; i++)
        {
            int tem = a[i];
            for(j = i - gap; j >= 0; j -= gap)
                if(a[j] < tem)
                    a[j + gap] = a[j];
                else
                    break;
            a[j + gap] = tem;
            
        }//print(a, n);
    }
}

冒泡排序

void bubblesort(int *a, int n)
{
    int count = 0;//记录交换次数
    for(int i = 1; i < n; i++)
        for(int j = 0; j < n - i; j++)
            if(a[j] > a[j + 1])
                swap(a[j], a[j + 1]), count ++;           
    //cout << count << endl;
}

快速排序

void quicksort(int *a, int l ,int r, int n)
{
    if(l >= r)
        return;
    
    int low = l, high = r;
    int tem = a[l];
    while(low < high)
    {
        for(; low < high && a[high] >= tem; high--); a[low] = a[high];
        for(; low < high && a[low] <= tem; low++);  a[high] = a[low];
    }
    a[low] = tem;
    
    //print(a, n);
    
    quicksort(a, l, low - 1, n);
    quicksort(a, low + 1, r, n);
    
}

堆排序

void heapadjuest(int *a, int i, int size)//小顶堆
{
    int t = i;
    while(1)
    {
        int u = t;
        int l = u * 2 + 1, r = u * 2 + 2;
        if(l < size && a[l] < a[u])
            u = l;
        if(r < size && a[r] < a[u])
            u = r;
        
        if(u == t)
            break;
        
        swap(a[t], a[u]);
        t = u;
    }
}

void heapsort(int *a, int n)
{
    for(int i = n / 2; i >= 0; i--)
        heapadjuest(a, i, n);
    
    for(int size = n - 1; size > 0; size--)
    {
        swap(a[0], a[size]);
        heapadjuest(a, 0, size);
    }
}

渣渣版归并排序

void merge(string *a ,int l, int r, int size)
{
    if(l + size > r)
        return;
    
    string tem[r - l + 1];
    int i = l, j = l + size, mid = l + size;
    int k = 0;
    while(i < mid && j <= r)
    {
        if(a[i] < a[j])
            tem[k++] = a[j++];
        else
            tem[k++] = a[i++];
    }
    while(i < mid)  tem[k++] = a[i++];
    while(j <= r)   tem[k++] = a[j++];
    
    for(int i = 0, j = l; j <= r; j++, i++)
        a[j] = tem[i];
}

void mergesort(string *a, int n)//排的是字符串, 降序
{
    int size = 1;
    while(size < n)
    {
        for(int i = 0; i < n; i += 2 * size)
            merge(a, i, i + size* 2 - 1 >= n - 1 ? n - 1 : i + size* 2 - 1, size);
        size *=2;
        for(int i = 0; i < n; i++)
        {
            if(i)
                cout << ' ';
            cout << a[i];
        }
        cout << endl;
    }
}

基数排序

void radixsort(int *a, int n)
{
    int maxn = -0x3f3f3f3f;
    int tem[n];
    for(int i = 0; i < n; i++)
        maxn = max(a[i], maxn), tem[i] = a[i];;
    
    int bit = 0;
    while(maxn) bit++, maxn /= 10;
    
    queue<int> q[10];
    queue<int> all;
    
    for(int i = 0; i < bit; i++)
    {
        for(int j = 0; j < n; j++)
        {
            for(int k = 0; k < i; k++)
                tem[j] /= 10;
        
            tem[j] %= 10;
            q[tem[j]].push(a[j]);
        }
        
        for(int j = 0; j < 10; j++)
        {
            cout << j <<":";
            if(q[j].empty())
                cout << "NULL";
            else
            {
                while(!q[j].empty())
                {
                    all.push(q[j].front());
                    cout << "->" << q[j].front();
                    q[j].pop();
                }
                cout << "->^";
            }
            cout << endl;
        }
        
        for(int j = 0; j < n; j++)
            tem[j] = a[j] = all.front(), all.pop();
        print(a, n);
    }
    cout << endl;
    
    
}

套套套套套套模板

#include <iostream>
#include <queue>

using namespace std;

void print(int *a, int n)
{
    for(int i = 0; i < n; i++)
    {
        if(i)
            cout << ' ';
        cout << a[i];
    }
    cout << endl;
}

void insertsort(int *a, int n)
{
    for(int i = 1, j; i < n; i++)
    {
        int tem = a[i];
        for(j = i - 1; j >= 0; j--)
            if(a[j] > tem)
                a[j + 1] = a[j];
            else
                break;
        a[j + 1] = tem;
        //print(a, n);
    }
}

void shellsort(int *a, int n)
{
    for(int gap = n / 2; gap >= 1; gap /= 2)
    {
        for(int i = gap, j; i < n; i++)
        {
            int tem = a[i];
            for(j = i - gap; j >= 0; j -= gap)
                if(a[j] < tem)
                    a[j + gap] = a[j];
                else
                    break;
            a[j + gap] = tem;
            
        }print(a, n);
    }
}

void bubblesort(int *a, int n)
{
    int count = 0;
    for(int i = 1; i < n; i++)
        for(int j = 0; j < n - i; j++)
            if(a[j] > a[j + 1])
                swap(a[j], a[j + 1]), count ++;
                
                
    cout << count << endl;
}

void quicksort(int *a, int l ,int r, int n)
{
    if(l >= r)
        return;
    
    int low = l, high = r;
    int tem = a[l];
    while(low < high)
    {
        for(; low < high && a[high] >= tem; high--); a[low] = a[high];
        for(; low < high && a[low] <= tem; low++);  a[high] = a[low];
    }
    a[low] = tem;
    
    print(a, n);
    
    quicksort(a, l, low - 1, n);
    quicksort(a, low + 1, r, n);
    
}

void heapadjuest(int *a, int i, int size)//小顶堆
{
    int t = i;
    while(1)
    {
        int u = t;
        int l = u * 2 + 1, r = u * 2 + 2;
        if(l < size && a[l] < a[u])
            u = l;
        if(r < size && a[r] < a[u])
            u = r;
        
        if(u == t)
            break;
        
        swap(a[t], a[u]);
        t = u;
    }
}

void heapsort(int *a, int n)
{
    for(int i = n / 2; i >= 0; i--)
        heapadjuest(a, i, n);
    
    cout << n << ' ';
    print(a, n);
    
    for(int size = n - 1; size > 0; size--)
    {
        swap(a[0], a[size]);
        heapadjuest(a, 0, size);
        cout << n << ' ';
        print(a, n);
    }
}


void merge(string *a ,int l, int r, int size)
{
    if(l + size > r)
        return;
    
    string tem[r - l + 1];
    int i = l, j = l + size, mid = l + size;
    int k = 0;
    while(i < mid && j <= r)
    {
        if(a[i] < a[j])
            tem[k++] = a[j++];
        else
            tem[k++] = a[i++];
    }
    while(i < mid)  tem[k++] = a[i++];
    while(j <= r)   tem[k++] = a[j++];
    
    for(int i = 0, j = l; j <= r; j++, i++)
        a[j] = tem[i];
}

void mergesort(string *a, int n)
{
    int size = 1;
    while(size < n)
    {
        for(int i = 0; i < n; i += 2 * size)
            merge(a, i, i + size* 2 - 1 >= n - 1 ? n - 1 : i + size* 2 - 1, size);
        size *=2;
        for(int i = 0; i < n; i++)
        {
            if(i)
                cout << ' ';
            cout << a[i];
        }
        cout << endl;
    }
}


void radixsort(int *a, int n)
{
    int maxn = -0x3f3f3f3f;
    int tem[n];
    for(int i = 0; i < n; i++)
        maxn = max(a[i], maxn), tem[i] = a[i];;
    
    int bit = 0;
    while(maxn) bit++, maxn /= 10;
    
    queue<int> q[10];
    queue<int> all;
    
    for(int i = 0; i < bit; i++)
    {
        for(int j = 0; j < n; j++)
        {
            for(int k = 0; k < i; k++)
                tem[j] /= 10;
        
            tem[j] %= 10;
            q[tem[j]].push(a[j]);
        }
        
        for(int j = 0; j < 10; j++)
        {
            cout << j <<":";
            if(q[j].empty())
                cout << "NULL";
            else
            {
                while(!q[j].empty())
                {
                    all.push(q[j].front());
                    cout << "->" << q[j].front();
                    q[j].pop();
                }
                cout << "->^";
            }
            cout << endl;
        }
        
        for(int j = 0; j < n; j++)
            tem[j] = a[j] = all.front(), all.pop();
        print(a, n);
    }
    cout << endl;
    
    
}

int main()
{
    int t;
    cin >> t;
    while(t--)
    {
        int n;
        cin >> n;
        
        int a[n];
        
        for(int i = 0; i < n; i++)
            cin >> a[i];
        
        radixsort(a, n);
       // cout << endl;
    
    //}
    }
}

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!