演算法 九大排序演算法總結

2021-07-05 03:46:58 字數 3064 閱讀 8724

這裡我不採用陣列來進行排序,而是採用更加符合應用的資料結構來排序。

#define m 100

typedef

int datatype;

typedef

struct nodetable;

這是一種簡單描述,更加詳細的資料機構應該是下面這樣(但是為了方便描述還是使用上面的簡單結構):

#define m 100

typedef int datatype;

typedef struct sort_record;

typedef struct nodetable;

說明:這裡不考慮程式的魯棒性,對於略去了對引數的檢查,只為了更加清晰地描述演算法,本來想用陣列的但是覺得使用結構體更加合乎實際應用邏輯。每種演算法都是必須非常熟練的,至於思路就不用說了讀**就行

注意:陣列中第乙個元素tab[0]都是拿來作為哨兵元素的。預設公升序排序。

//1.直接插入

void direct_insert_sort(table* tab)

tab->r[j+1] = tab->r[0];

}}

當某些元素是有序的時候,利用二分查詢,找到插入的位置,然後插入位置後面的元素後移一位。

void binary_insert_sort(table* tab)

else

}for (j=i-1;j>=left;j--)

tab->r[left] = tab->r[0];

}}

tab->r[j +gap] = tab->r[0];

}gap = gap/2;

}}

//4.氣泡排序

void bubble_sort(table* tab)}}

}

//5.快速排序

void quick_sort(table* tab,int left,int right)

while(tab->r[j] >= tab->r[i]&&iif (ir[j] = tab->r[i];

j--;}}

tab->r[i] = tab->r[0];

quick_sort(tab,left,i-1);

quick_sort(tab,i+1,right);

}

//6.直接選擇

void direct_select_sort(table* tab)

if (k != i)

}}

//7.堆排序

//index表示要調整的節點的下標,n表示堆元素個數。

void shift_heap(table* tab,int index,int n)

else

}tab->r[i] = tab->r[0];

}void heap_sort(table* tab)

for (int i = 2;ilengh;i++)

}

//8.歸併排序

//將tabs中的u-m-v的元素合併到tabg中

void merge(table* tabs,table* tabg,int u,int m,int v)

else

}if (i<=m)

else

}//遞迴實現

void merge_sort1(table* tabs,table* tabg,int left,int right)

int mid = (left+right)/2;

merge_sort1(tabs,tabg,left,mid);

merge_sort1(tabs,tabg,mid+1,right);

merge(tabs,tabg,left,mid,right);

}//非遞迴實現

void merge_pass(table* tabs,table* tabg,int

len)

if (i+len

-1len

-1,n);

}else

}}void merge_sort(table* tab)

}

桶排序(bucket sort)的原理很簡單,它是將陣列分到有限數量的桶子裡。

假設待排序的陣列a中共有n個整數,並且已知陣列a中資料的範圍[0, max)。在桶排序時,建立容量為max的桶陣列r,並將桶陣列元素都初始化為0;將容量為max的桶陣列中的每乙個單元都看作乙個」桶」。

在排序時,逐個遍歷陣列a,將陣列a的值,作為」桶陣列r」的下標。當a中資料被讀取時,就將桶的值加1。例如,讀取到陣列a[3]=5,則將r[5]的值+1。

桶排序不能應用於排序數很大的情況,因為這樣會需要乙個很大很大桶,顯然是科學的。

桶排序是穩定的,最好的時間複雜度達到o(n)

/*

* 桶排序

* tab -- 排序結構

* max --待排序結構中最大範圍[0,max)

*/void bucket_sort(table* tab,int

max)

//2.排序

for(i = 1,j = 1;i < max;i++)

free(bucket);

}

基數排序比較麻煩,自我認為找工作,面試筆試都不會考到,理解基本思路即可。

實現思路:

最高位優先(most significant digit first)法,簡稱msd法:先按k1排序分組,同一組中記錄,關鍵碼k1相等,再對各組按k2排序分成子組,之後,對後面的關鍵碼繼續這樣的排序分組,直到按最次位關鍵碼kd對各子組排序後。再將各組連線起來,便得到乙個有序序列。

最低位優先(least significant digit first)法,簡稱lsd法:先從kd開始排序,再對kd-1進行排序,依次重複,直到對k1排序後便得到乙個有序序列。

排序演算法 九大排序演算法總結

參考部落格 排序演算法 直接插入排序 時間複雜度 空間複雜度 o 1 穩定性 穩定 參考部落格 排序演算法 希爾排序 時間複雜度 空間複雜度 o 1 穩定性 不穩定 參考部落格 排序演算法 選擇排序 時間複雜度 空間複雜度 o 1 穩定性 不穩定 參考部落格 排序演算法 堆排序 時間複雜度 空間複雜...

九大排序演算法

常見的排序分為兩類,一類是內部排序 直接插入排序 希爾排序 簡單選擇排序 堆排序 氣泡排序 快速排序 歸併排序 基數排序 一類是外部排序。當n較大時,應該使用時間複雜度為o nlog2n 的排序,如快速排序 堆排序 歸併排序。快排是基於比較的內部排序中,最好的方法。假設陣列為r 0 r n 1 第一...

九大排序演算法

重複地走訪過要排序的數列,一次比較兩個元素,如果他們的順序錯誤就把他們交換過來。走訪數列的工作是重複地進行直到沒有再需要交換,也就是說該數列已經排序完成。這個演算法的名字由來是因為越大的元素會經由交換慢慢 浮 到數列的頂端,故名。package com.demo.main 氣泡排序 public c...