Linux学习之路(12)

排序:

1、冒泡排序

#include <stdio.h>

void mySwap(int *a, int i, int j)
{
    int tmp = a[i];
    a[i] = a[j];
    a[j] = tmp;
}

void myPrint(int *a, int len)
{
    int i;
    for (i = 0; i < len; i++)
    {
        printf ("%4d", a[i]);
    }
    printf ("\n");
}


void mySort(int *a, int len)
{
    int left  = 0;
    int right = len-1;
    
    int i;
    while (left < right)
    {
        for (i = left; i < right; i++)  // 从左往右走,找最大元素沉底
        {
            if (a[i] > a[i+1])
            {
                mySwap(a, i, i+1);
            }
        }
        right--;
        
        for (i = right; i>left; i--)    // 从右往左走,找最小元素上浮
        {
            if (a[i] < a[i-1])
            {
                mySwap(a, i, i-1);
            }
        }
        left++;
    }
}


void mySort1(int *a, int left, int right)
{
    if (left >= right)
        return;
    
    int i;
    for (i = left; i < right; i++)  // 从左往右走,找最大元素沉底
    {
        if (a[i] > a[i+1])
        {
            mySwap(a, i, i+1);
        }
    }
    right--;
    
    for (i = right; i>left; i--)    // 从右往左走,找最小元素上浮
    {
        if (a[i] < a[i-1])
        {
            mySwap(a, i, i-1);
        }
    }
    left++;
    
    mySort1(a, left, right);
}

int main()
{
    int a[] = {9,8,7,6,5,4,3,2,1,0};
    int len = sizeof(a)/sizeof(a[0]);
    // mySort(a, len);
    mySort1(a, 0, len-1);
    myPrint(a, len);
    
    
    
    return 0;
}

 

2、冒泡排序改进

#include <stdio.h>

void mySwap(int *a, int i, int j)
{
    int tmp = a[i];
    a[i] = a[j];
    a[j] = tmp;
}


void mySort(int *a, int len)
{
    int i, j;
    for (i=0; i < len-1; i++)                 // 将最大元素沉底的次数
    {
        for (j = 0; j < len-1-i; j++)      // 将当前数组最大元素沉底
        {
            if (a[j] > a[j+1])
            {
                mySwap(a, j, j+1);  // 交换
            }
        }
    }
}

void mySort1(int *a, int len)
{
    if (len == 1)
        return;
    
    int i, j;
    for (j = 0; j < len-1; j++)     
    {
        if (a[j] > a[j+1])
        {
            mySwap(a, j, j+1);  // 交换
        }
    }
    
    mySort1(a, len-1);
}

void myPrint(int *a, int len)
{
    int i;
    for (i = 0; i < len; i++)
    {
        printf ("%4d", a[i]);
    }
    printf ("\n");
}

int main()
{
    int a[] = {9,8,7,6,5,4,3,2,1,0};
    int len = sizeof(a)/sizeof(a[0]);
    // mySort(a, len);
    mySort1(a, len);
    myPrint(a, len);
    
    
    
    return 0;
}

 

 

3、选择排序

#include <stdio.h>

void mySwap(int *a, int i, int j)
{
    int tmp = a[i];
    a[i] = a[j];
    a[j] = tmp;
}
void myPrint(int *a, int len)
{
    int i;
    for (i = 0; i < len; i++)
    {
        printf ("%4d", a[i]);
    }
    printf ("\n");
}


void mySort(int *a, int len)
{
    int i, j;
    
    for (i = 0; i < len-1; i++)      // 找的次数
    {
        int min = i; 
        for (j = i+1; j < len; j++)
        {
            if (a[min] > a[j])
            {
                min = j;
            }
        }
    
        if (min != i)
            mySwap(a, min, i);
    }
}

int main()
{
    int a[] = {9,8,7,6,5,4,3,2,1,0};
    int len = sizeof(a)/sizeof(a[0]);
    mySort(a, len);
    myPrint(a, len);
    
    
    
    return 0;
}
 

 

4、插入排序

#include <stdio.h>

void mySwap(int *a, int i, int j)
{
    int tmp = a[i];
    a[i] = a[j];
    a[j] = tmp;
}
void myPrint(int *a, int len)
{
    int i;
    for (i = 0; i < len; i++)
    {
        printf ("%4d", a[i]);
    }
    printf ("\n");
}


void mySort(int *a, int len)
{
    int i;
    for (i = 1; i < len; i++)
    {
        int get = a[i];
        
        int j = i-1;
        while (j >= 0 && a[j]>get) 
        {
            a[j+1] = a[j];
            j--;
        }
        a[j+1] = get;
    }
}

int main()
{
    int a[] = {9,8,7,6,5,4,3,2,1,0};
    int len = sizeof(a)/sizeof(a[0]);
    mySort(a, len);
    myPrint(a, len);
    
    return 0;
}
 

 

5、二分插入排序

#include <stdio.h>

void mySwap(int *a, int i, int j)
{
    int tmp = a[i];
    a[i] = a[j];
    a[j] = tmp;
}
void myPrint(int *a, int len)
{
    int i;
    for (i = 0; i < len; i++)
    {
        printf ("%4d", a[i]);
    }
    printf ("\n");
}


void mySort(int *a, int len)
{
    int i;
    for (i = 1; i < len; i++)
    {
        int get = a[i];
        int left  = 0;
        int right = i-1; 
        
        while (left <= right)
        {
            int mid = (left+right)/2;     // 中间元素的下标
            if (a[mid] > get)
                right = mid-1;
            else
                left  = mid+1;
        }
        
        // 移位
        int j;
        for (j = i-1; j >= left; j--)
            a[j+1] = a[j];
        
        a[left] = get;
    }
}

int main()
{
    int a[] = {9,8,7,6,5,4,13,3,2,1,0};
    int len = sizeof(a)/sizeof(a[0]);
    mySort(a, len);
    myPrint(a, len);
    
    return 0;
}

 

 

6、希尔排序

#include <stdio.h>

void mySwap(int *a, int i, int j)
{
    int tmp = a[i];
    a[i] = a[j];
    a[j] = tmp;
}
void myPrint(int *a, int len)
{
    int i;
    for (i = 0; i < len; i++)
    {
        printf ("%4d", a[i]);
    }
    printf ("\n");
}


void mySort(int *a, int len)
{
    int gap = 1;
    
    while(gap < len)
    {
        gap = gap*3+1;
    }
    
    while (gap > 0)
    {
        int i;
        for (i = gap; i < len; i++)
        {
            int get = a[i];
            
            int j = i-gap;
            while (j >= 0 && a[j]>get) 
            {
                a[j+gap] = a[j];
                j -= gap;
            }
            a[j+gap] = get;
        }
        printf ("gap = %d  :  ", gap);
        myPrint(a, len);
        gap = gap / 3;
    }
}

int main()
{
    int a[] = {9,8,7,6,5,4,3,2,1,0};
    int len = sizeof(a)/sizeof(a[0]);
    mySort(a, len);
    myPrint(a, len);
    
    return 0;
}
 

 

7、堆排序

#include <stdio.h>

void mySwap(int *a, int i, int j)
{
    int tmp = a[i];
    a[i] = a[j];
    a[j] = tmp;
}
void myPrint(int *a, int len)
{
    int i;
    for (i = 0; i < len; i++)
    {
        printf ("%4d", a[i]);
    }
    printf ("\n");
}

// 调整堆
void herify(int *a, int index, int len)
{
    int lindex = 2*index + 1;  // 左孩子结点下标
    int rindex = 2*index + 2;  // 右孩子结点下标
    
    int max = index;
    if (lindex<len && a[max]<a[lindex])
        max = lindex;
    
    if (rindex<len && a[max]<a[rindex])
        max = rindex;

    if (max != index)
    {
        mySwap(a, max, index);    
        herify(a, max, len);
    }
}


void mySort(int *a, int len)
{
    // 建堆: 从非叶节点开始,把每一个结点搞成大顶堆
    int i;
    for (i = len/2-1; i>=0; i--)
    {
        herify(a, i, len);
    }
    
    // 排序
    int count = len;
    for (i=len-1; i > 0; i--)
    {
        mySwap(a, 0, i);     // 堆顶元素和当前堆最后一个元素进行交换
        count--;
        herify(a, 0, count);
    }
}

int main()
{
    int a[] = {5,8,6,7,9,4,3,2,1,0};
    int len = sizeof(a)/sizeof(a[0]);
    mySort(a, len);
    myPrint(a, len);
    
    return 0;
}

 

 

8、归并排序

#include <stdio.h>

void mySwap(int *a, int i, int j)
{
    int tmp = a[i];
    a[i] = a[j];
    a[j] = tmp;
}
void myPrint(int *a, int len)
{
    int i;
    for (i = 0; i < len; i++)
    {
        printf ("%4d", a[i]);
    }
    printf ("\n");
}

void merge(int *a, int left, int mid, int right, int *tmp)
{
    int i = left;    // 左半边数组下标
    int j = mid+1;   // 右半边数组下标
    int k = 0;       // 临时数组使用的下标
    
    while(i<=mid && j<=right)
    {
        if (a[i] < a[j])
            tmp[k++] = a[i++];
        else
            tmp[k++] = a[j++];
    }
    
    while(i<=mid)
    {
        tmp[k++] = a[i++];
    }
    
    while (j<=right)
    {
        tmp[k++] = a[j++];
    }
    
    for(i = 0; i < k; i++)
    {
        a[left+i] = tmp[i];
    }
}

void mergeSort(int *a, int left, int right, int *tmp)
{
    int mid = (left+right)/2;
    
    if (left < right)
    {
        mergeSort(a, left, mid, tmp);     // 对左边数组进行归并排序
        mergeSort(a, mid+1, right, tmp);  // 对右边数组进行归并排序
        merge(a, left, mid, right, tmp);  // 合并左右两个数组
    }
}

int main()
{
    int a[] = {5,8,6,7,9,4,3,2,1,0};
    int len = sizeof(a)/sizeof(a[0]);
    
    int tmp[10];
    mergeSort(a, 0, len-1, tmp);
    myPrint(a, len);
    
    return 0;
}


 

9、快速排序

#include <stdio.h>

void mySwap(int *a, int i, int j)
{
    int tmp = a[i];
    a[i] = a[j];
    a[j] = tmp;
}
void myPrint(int *a, int len)
{
    int i;
    for (i = 0; i < len; i++)
    {
        printf ("%4d", a[i]);
    }
    printf ("\n");
}

int partion(int *a, int left, int right)
{
    int pivot = a[right];    // 以最后一个元素作为基准值
    
    while(left < right)
    {
        while (a[left] <= pivot && left < right)
        {
            left++;
        }
        if (left < right)
        {
            a[right] = a[left];
            right--;
        }
        
        
        while (a[right] >= pivot && left < right)
        {
            right--;
        }
        
        if (left < right)
        {
            a[left] = a[right];
            left++;
        }
    }
    
    a[left] = pivot;
    
    return left;
}

void quickSort(int *a, int left, int right)
{
    if (left < right)
    {
        int pivotIndex = partion(a, left, right);    // 算基准值下标
        quickSort(a, left, pivotIndex-1);    // 对左半部分做快速排序
        quickSort(a, pivotIndex+1, right);   // 对右半部分做快速排序
    }
}

int main()
{
    int a[] = {5,8,6,0,9,4,3,2,1,7};
    int len = sizeof(a)/sizeof(a[0]);
    
    quickSort(a, 0, len-1);
    myPrint(a, len);
    
    return 0;
}


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值