C語言 排序算法總結(簡單版)

排序算法複雜度表:

種類 最優時間複雜度 平均時間複雜度 最差時間複雜度 空間複雜度 穩定性
冒泡排序 O(N) O(N²) O(N²) O(1) 穩定
選擇排序 O(N) O(N²) O(N²) O(1) 不穩定
插入排序 O(N) O(N²) O(N²) O(1) 穩定
快速排序 O(N*log2N) O(N*log2N) O(N2) O(log2n)~O(n)  不穩定
歸併排序 O(N*log2N)  O(N*log2N)  O(N*log2N)  O(n) 穩定
 堆排序 O(N*log2N) O(N*log2N) O(N*log2N) O(1) 不穩定
希爾排序 O(N) O(N) O(N2) O(1) 不穩定

1、冒泡排序:比較相鄰的兩個元素大小。

void bubblesort(int arr[],int len)
{
	int i,j,tmp,flag=0,k;
	if(len<=0||arr==NULL) return ;
	for(i=0;i<len;i++)
	{
		for(j=0;j<len-i-1;j++)
		{
			flag = 0;
			if(arr[j]>arr[j+1])
			{
				flag = 1;
				tmp = arr[j];
				arr[j] = arr[j+1];
				arr[j+1] = tmp;
			}
		}
		if(flag == 0)
		{
			break;
		}
	}
}

2、選擇排序:選擇最大(小)值放在後(前)面。

void selectsort(int arr[],int len)
{
    int i,j;
    int tmp;
    int minindex;
    if(len <= 0 || arr == NULL) return ;
    for(i=0;i<len-1;i++)
    {
        minindex = i;
        for(j=i+1;j<len;j++)
        {
            if(arr[minindex] > arr[j])
            {
                minindex = j;
            }
        }
        //put min head;
        tmp = arr[i];
        arr[i] = arr[minindex];
        arr[minindex] = tmp;

    }
}

3、插入排序:將無序數據插入到有序數據。

void insertsort(int arr[],int len)
{
    int i,j;
    int tmp;
    for(i=1;i<len;i++)
    {
        j = i-1;
        tmp = arr[i];
        while(arr[j] > tmp && j >= 0)
        {
            arr[j+1] = arr[j];
            j--;
        }
        arr[j+1] = tmp;
    }
}

4、計數排序:數據分配比較密集。

void countsort(int arr[],int len)
{   
    if(len <= 0 || arr == NULL) return ;
    int nmax,nmin;
    int i,j=0;
    nmax = arr[0];
    nmin = arr[0];
    for(i=0;i<len;i++)
    {
        if(arr[i]>nmax)
        {   
            nmax = arr[i];
        }
        if(arr[i]<nmin)
        {   
            nmin = arr[i];
        }
    }
    int *cnt = NULL;
    cnt = (int *)malloc(sizeof(int)*(nmax-nmin+1));
    memset(cnt,0,sizeof(int)*(nmax-nmin+1));
    for(i=0;i<len;i++)
    {   
        cnt[arr[i]-nmin]++;
    }
    for(i=0;i<nmax-nmin+1;i++)
    {
        while(cnt[i] != 0)
        {
            arr[j] = i + nmin;
            j++;
            cnt[i]--;
        }
    }
    free(cnt);
    cnt = NULL;
}

5、快速排序:確定一個標準值,以標準值爲界將數據分成兩部分,左邊小右邊大,遞歸。

int sort(int arr[],int low ,int high)
{   
    int tmp;
    tmp = arr[low];
    while(low < high)
    {
        while(high > low)
        {
            if(arr[high] < tmp)
            {
                arr[low] = arr[high];
                low++;
                break;
            }
            high--;
        }
        while(low < high)
        {
            if(arr[low] > tmp)
            {
                arr[high] = arr[low];
                high--;
                break;
            }
            low++;
        }
    }
    arr[low] = tmp;
    return low;
}
int seg_sort(int arr[],int low,int high)
{
int tmp;
    tmp = arr[high];
    int flag = low -1 ;
    while(low<high)
    {
        if(arr[low] < arr[high])
        {
            if(++flag != low)
            {
                arr[flag] = arr[flag]^arr[low];
                arr[low] = arr[flag]^arr[low];
                arr[flag] = arr[flag]^arr[low];
            }
        }
        low++;
    }
    if(++flag != high)
    {
        arr[flag] = arr[flag]^arr[high];
        arr[high] = arr[flag]^arr[high];
        arr[flag] = arr[flag]^arr[high];
    }
    return flag ;
}
void quicksort(int arr[],int low,int high)
{
    if(arr == NULL || low >= high) return ;
    int nstanderd;
    //nstanderd = sort(arr,low,high);
    nstanderd = seg_sort(arr,low,high);

    quicksort(arr,low,nstanderd-1);
    quicksort(arr,nstanderd+1,high);
}

6、歸併排序:

void mergesort(int arr[],int low,int high)
{   
    if(arr == NULL || low >= high) return ;
    //chaifen
    int mid ; 
    mid = low + (high - low)/2;
    
    mergesort(arr,low,mid);
    mergesort(arr,mid+1,high);
    
    //hebin
    merge(arr,low,high);
}
void merge(int arr[],int low,int high)
{
    int begin1;
    int begin2;
    int end1;
    int end2;
    int *ptmp = NULL;
    ptmp = (int *)malloc(sizeof(int)*(high-low+1));
    begin1 = low;
    end1 = low+(high-low)/2;
    begin2 = end1+1;
    end2 = high;

    int i = 0;
    while(begin1 <= end1 && begin2 <= end2)
    {
        if(arr[begin1] < arr[begin2])
        {
            ptmp[i] = arr[begin1];
            i++;
            begin1++;
        }
        else
        {
            ptmp[i] = arr[begin2];
            i++;
            begin2++;
        }
    }
    //rest
    while(begin1 <= end1)
    {
        ptmp[i] = arr[begin1];
        i++;
        begin2++;
    }
    for(i=0;i<high-low+1;i++)
    {
        arr[low+i] = ptmp[i];
    }
    free(ptmp);
    ptmp = NULL;
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章