1. 程式人生 > >c語言之合併排序實現

c語言之合併排序實現

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
//將兩個有序序列合併為一個有序序列
void merge(int a[],int left_pos,int right_pos)
{
     int temp[right_pos-left_pos+1];
     int mid=(left_pos+right_pos)/2;
     int left=left_pos,right=mid+1;
     int count=0;


     while(left<=mid&&right<=right_pos)
     {
         if(a[left]<=a[right])
         {
            temp[count++]=a[left++];
         }
         else
         {
            temp[count++]=a[right++];
         }
     }
     while(left<=mid)
     {
         temp[count++]=a[left++];
     }
     while(right<=right_pos)
     {
         temp[count++]=a[right++];
     }
     memcpy(&a[left_pos],temp,sizeof(temp));


}


//合併排序
void merge_sort(int a[],int left_pos,int right_pos)
{
    if(left_pos<right_pos)
    {
         //一分為二
         int mid=(left_pos+right_pos)/2;
         //左合併
         merge_sort(a,left_pos,mid);
         //右合併
         merge_sort(a,mid+1,right_pos);
         //合而為一
         merge(a,left_pos,right_pos);
    }
}


int main()
{
    //測試用例
    int a[]={331,34,43,64,75,43,7,4234,876,34};
    //合併排序
    merge_sort(a,0,9);
    //列印結果
    int i;
    for(i=0;i<10;i++)
    {
        printf("%d  ",a[i]);
    }
    printf("\n");
system("pause");
return 1;
}

相關推薦

c語言合併排序實現

#include <stdio.h> #include <stdlib.h> #include <string.h> //將兩個有序序列合併為一個有序序列 void merge(int a[],int left_pos,int right

C語言合併排序

一、基本運算: 兩路合併排序:將兩個有序序列合併成一個有序序列。 二、步驟: ①把待排序的序列分成長度為1的子序列(只包含一個記錄的序列被認為是有序的)→得到n個長度為1的有序子序列; ②實施兩兩合併,合併相鄰的兩個子序列→得到大約n/2個長度為2的有序子序列; ③重複步驟

C語言冒泡排序

最大 fine 編程思路 watermark 冒泡 iss style ack return 如果要對含有n個數的序列進行升序排列,冒泡排序算法步驟是: 1、從存放序列的數組中的第一個元素開始到最後一個元素。依次對相鄰兩數進行比較,若前者大後者小,則交換兩數的位置

c語言氣泡排序

氣泡排序的思想是將相鄰的元素進行兩兩比較,交換位置,大的放在後面,如將五個數進行比較,第一次排序將最大的放到了第五個,第二次比較將次要大的放到了第四個,依次類推,實現有序化 void BubbleSort(int r[],int n) { for(int i=1;i<=n-1;i+

C語言linux核心實現平方根計算演算法

關於平方根的計算,在linux核心中也有實現,就像math.h數學庫裡的sqrt這個函式一樣。       平方根的公式定義: 如果一個非負數x的平方等於a,即    ,    ,那麼這個非負

c語言選擇排序

//選擇排序 include "stdio.h" void sort(int array[5]) { int i,j; for(i=4;i>0;i--)//遍歷的次數 { int flag=0; //最大元素的下標 //找到最大

C語言氣泡排序的優化

1、原氣泡排序 void print_arr(int arr[], int sz) { int i = 0; for (i = 0; i < sz;i++) {

分治法合併排序C實現

#include <stdio.h> void merge(int a[],int p,int q,int r) { int n1=q-p+1,n2=r-q; int

C語言實現TOP K算法系列快速排序實現

TOP K演算法的實現有很多種方式,其中類似於快排的實現是非常棒的,堆的實現也是非常好的,其中就是關於快排的實現會得到一個TOP K的集合,而這個集合不一定保證裡面的資料都是有序的。 下面就獻上TOP

C語言歸並排序

ack trac for pos 語言 font tex 合並 %d 即將兩個都升序(或降序)排列的數據序列合並成一個仍按原序排列的序列。 上代碼: #include <stdio.h> #include <stdlib.h> #defin

C語言利用快速排序(QuickSort)實現對陣列的排序

 快速排序是一種交換排序,是對氣泡排序的改進 利用氣泡排序的特性,對目標進行分段冒泡 #include "stdio.h" int a[6];//定義一個數組,長度為6,實際存放5個元素, /** * 快速排序函式 * @param left 最左邊的指標 * @param

C語言二叉排序

typedef struct BiTNode{ int  data; struct BiTNode *lchild; struct BiTNode *rchild;}Bintree;  #include<stdio.h>

C語言中常用排序演算法(氣泡排序、選擇排序、插入排序、希爾排序、快速排序、堆排序實現比較

以下程式在win10 X64位作業系統,使用VS2017執行驗證可行 排序是非常重要且很常用的一種操作,有氣泡排序、選擇排序、插入排序、希爾排序、快速排序、堆排序等多種方法。 例項1 冒泡法排序 1.前言: 陣列中有N個整數,用冒泡法將它們從小到大(或從大到小)排序。冒泡法

C語言二分歸併排序實現

趁著十一小長假,自學了一點兒演算法(初級),複雜度最低的就是二分歸併排序(nlog(n)),也是分支歸併思想的體現。博主,基於閒的沒事的原則,好久沒碰C語言,所以親自除錯了一段程式碼,並且進行debug測試得到。其中學習了不少新的知識。 直接貼程式碼:

C語言二叉排序樹的實現

二叉排序樹是一種排序和查詢都很有用的特殊二叉樹。 二叉樹的性質: 1.      若它的左子樹不為空,則左子樹上所有結點的值均小於它的根節點的值。 2.      若它的右子樹不為空,則右子樹上所有節點的值均大於它的根節點的值。 3.      他的左右子樹也是二叉排序樹。

C語言排序

氣泡排序 兩兩比較,小的先冒泡。 void bubbling(const char* str) { int len=strlen(str); int t; int i; for(t=1;t<len;t++) //t代表要排序幾位,注意t==1

c語言選擇法排序

#include<stdio.h> void select_score(int a[],int n)//排序函式 {     int i,j,k,temp;     for(i=0;i<n-1;++i)     {         k=i;        

C語言最好理解的通過函式指標作為引數實現回撥函式

1、函式指標回撥解釋 回撥函式就是一個通過函式指標呼叫的函式。如果你把函式的指標(地址)作為引數傳遞給另一個函式,當這個指標被用來呼叫其所指向的函式時,我們就說這是回撥函式 2、程式碼實現 #i

C語言直接插入排序和折半插入排序演算法的實現

直接插入排序是是一種穩定的排序,其演算法簡便,適用於順序結構和鏈式結構,更適合於基本有序(正序)的情況。其空間複雜度為O(1),時間複雜度為O(n2)。下面是實現演算法: 先是預定義和型別定義: typedef int Status; typedef int ElemTyp

C語言俄羅斯方塊遊戲實現

  來自《C語言課程設計案例精編》,蠻好的,可以參照。 /*  *俄羅斯方塊源程式  */ #include <stdio.h> #include <stdlib.h> #include <dos.h> #include <grap