常見排序演算法

2021-10-13 23:32:06 字數 2524 閱讀 1435

*穩定排序演算法:對於值相同的元素經過排序後其順序和輸入一樣的演算法。

不穩定排序演算法即值相同的元素排序後順序發生變化。

當資料報含多個資訊而要按其中的某乙個資訊排序,要求其它資訊盡量按輸入的順序排列時,穩定排序演算法就很重要了。

第一次迴圈找出最大值,第二次迴圈找出第二大的值。。。直到找到最後乙個。

先將前面 i ( 1 <= i <= n) 個元素排序,然後將第 (i+1) 個元素插入到 前面 i 個有序序列中。 

// 版本1

void insertsort(int a, int n)

// 版本2

void insertsort1(int a, int n)

}

用乙個bit位來標記某個元素對應的value, 而key即是該元素。由於採用了bit為單位來儲存資料,因此在儲存空間方面,可以大大節省。

假設我們要對0-7內的5個元素(4,7,2,5,3)排序(所有元素不能重複)。

當採用bit-map的方法排序時,要表示8個數,我們就需要8個bit(1bytes),首先我們開闢1byte的空間,將這些空間的所有bit位都置為0;

然後遍歷這5個元素,首先第乙個元素是4,那麼就把4對應的位置為1(可以這樣操作 p+(i/8)|(0×01<<(i%8)) 當然了這裡的操作涉及到big-ending和little-ending的情況,

這裡預設為big-ending);

因為是從零開始的,所以要把第五位置為1。

然後再處理第二個元素7,即把第八位置為1;接著再處理第三個元素,一直到最後處理完所有的元素,將相應的位置為1。

然後我們現在遍歷一遍bit區域,將該位是一的位的編號輸出(2,3,4,5,7),這樣就達到了排序的目的。

演算法步驟:

申請空間,使其大小為兩個已經排序序列之和,該空間用來存放合併後的序列;

設定兩個指標,最初位置分別為兩個已經排序序列的起始位置;

比較兩個指標所指向的元素,選擇相對小的元素放入到合併空間,並移動指標到下一位置;

重複步驟 3 直到某一指標達到序列尾;

將另一串行剩下的所有元素直接複製到合併序列尾。

// 迭代法 實現歸併排序(還可以用遞迴法實現)

void merge_sort(int arr, int len)

int *temp = a; // 兩個指標的交換。

a = b; // 將部分排好的序列存入 a,然後對 a 再進行排序的結果又存入 b 中。

b = temp;

} if(a != arr)

free(b);

}

這個版本的關鍵是設定一快一慢兩個指標,慢指標左側都是小於pivot(包含慢指標所在位置),

慢指標到快指標之間的值是大於等於pivot,快指標右側的值是還未比較過的。如下圖所示:

head         小於pivot            slow       大於等於pivot         fast               還未比較                 end

// 交換兩個位址中的值

void swap(int *a, int *b)

// 對於陣列 a[len] 排序,直接呼叫 qsort(a, 0, len - 1);

void qsort(int a, int head, int end)

swap(&a[head], &a[slow]);

qsort(a, head, slow-1);

qsort(a, slow+1, end);

}

head          小於pivot                left             還未比較的值               right               大於等於pivot               end

// 對於要排序的 a[len], 可直接呼叫 qsort(a, 0, len - 1)

void qsort(int *a, int head, int end)

int left = head;

int right = end;

int pivot = a[head];

while(left < right) /*控制在當組內尋找一遍*/

a[left] = a[right];

while(left < right && pivot >= a[left])

a[right] = a[left]; // a[right]的值不會丟失,因為上面已經將其儲存在其他位置了

}a[left] = pivot; /*當在當組內找完一遍以後就把中間數key回歸*/

sort(a, head, left - 1); /*最後用同樣的方式對分出來的左邊的小組進行同上的做法*/

sort(a, left + 1, end); /*用同樣的方式對分出來的右邊的小組進行同上的做法*/

}

常見排序演算法

一.選擇排序 1.概念 每次從無序的子陣列裡面選擇最小的數,放在有序區的後面 既與無序區的首元素交換 不穩定排序 時間複雜度o n 2 輔助儲存o 1 2.實現 int selection sort int a,int len len為陣列元素個數 二.氣泡排序 1.概念 重複訪問數列n 1次,每次...

常見排序演算法

1 插入排序 直接插入排序,是一種最簡單的排序方法,它的基本操作是將乙個記錄插入到已排好序的有序表中,從而得到乙個新的 記錄數增1的有序表。初始 38 65 27 76 13 i 1 13 選13為監視哨並假設為乙個有序序列 i 2 13 38 待插入元素38 13 i 3 13 38 65 待插入...

常見排序演算法

排序演算法作為常用的基本演算法,今天就來總結一下各種經典排序演算法,這裡只貼出 對演算法的文字描述可以在課本或其它部落格上找到很多詳盡的敘述,這裡直接上 而不是常見演算法書上的偽 希望對正在努力學資料結構與演算法的朋友們有幫助 1 氣泡排序 void bubblesort t a,int n if ...