排序算法

冒泡排序:泡泡(最小值)从底部冒上来

void bubblesort(int *arr, const int len)
{
    if(arr == NULL)
        return;
    for(int i = 0; i <len - 1; i++) {
        for(int j = len-2; j>= i; j--) {
            if(arr[j] > arr[j+1])
                swap(arr[j],arr[j+1]);
        }
    }
}

 

 

选择排序:从当前开始,选择从后一个元素开始的其余所有元素中的最小值,交换,使最小值到前面。

void selectsort(int * arr, const int len)
{
    if(arr == NULL)
        return;
    for(int i = 0; i < len - 1; i++){
        int min = i;
        for(int j = i+1; j < len; j++) {
            if(arr[min] > arr[j])
                min = j;
        }
        if(i != min)
            swap(arr[i],arr[min]);
    }
}

简单插入排序:如果当前元素i比前面的元素小,将当前元素插入到前面合适的位置中

void insertsort(int *arr, const int len)
{
    if(arr == NULL)
        return;
    for(int i = 1; i < len; i++){
        if(arr[i] < arr[i-1]) {
            int temp = arr[i];
            int j = i-1;
            for(;arr[j] > temp; j--) 
                arr[j+1] = arr[j];
            arr[j+1] = temp;
        }
        
    }
}

 堆排序:

void heapsort(int *arr, const int len) 
{
    if(arr == NULL)
        return;
    int i = 0;
    for(i = len/2;i >= 0; i--) {
        heapadjust(arr,len,i,len-1);//第一次调整,把大的元素放到父节点
    }
    for(i = len-1; i > 0;i--) {
        swap(arr[i],arr[0]);//交换第一个和最后一个元素
        heapadjust(arr,len,0,i-1);//调整余下的元素。由于前面已经调整过了,所以从0开始,然后选择元素较大的分支,得到这些元素中的最大值
    }
}

//把大的数字调整到父节点
void heapadjust(int *arr, const int len, int s, int m)
{
    int temp = arr[s];
    for(int j = 2*s; j <= m; j *= 2){
        if(j < m && arr[j] < arr[j+1])
            ++j;
        if(temp >= arr[j])
            break;
        arr[s] = arr[j];
        s = j;
    }
    arr[s] = temp;
}

归并排序:归并过程很重要

void mergesort(int *arr, const int len)
{
    msort(arr,arr,0,len-1);
}

void msort(int *sr,int *tr1,int s, int t)
{
    int m;
    int tr2[arr_len];
    if(s == t) 
        tr1[s] = sr[s];
    else {
        m = (s+t)/2;
        msort(sr,tr2,s,m);
        msort(sr,tr2,m+1,t);
        merge(tr2,tr1,s,m,t);
    }
}

void merge(int *sr, int *tr, int s, int m, int t)
{
    int i = s, j = m+1, k = s;
    for(; i <= m && j <= t; k++) {
        if(sr[i] < sr[j])
            tr[k] = sr[i++];
        else 
            tr[k] = sr[j++];
    }
    while(i <= m) {
        tr[k++] = sr[i++];
    }
    while(j <= t) {
        tr[k++] = sr[j++];
    }
}

快速排序

void quicksort(int *arr, const int len)
{
    qsort(arr,0,len-1);
}

void qsort(int *arr, int low, int high)
{
    if(low < high) {
        int pivot = partition(arr,low,high);
        qsort(arr,low,pivot-1);
        qsort(arr,pivot+1,high);
    }
}

int partition(int *arr, int low, int high)
{
    int pivotkey = arr[low];
    while(low < high) {
        while(low < high && arr[high] >= pivotkey )
            high--;
        swap(arr[low],arr[high]);
        while(low < high && arr[low] <= pivotkey)
            low++;
        swap(arr[low],arr[high]);
    }
    return low;
}

 

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。