這裡我不採用陣列來進行排序,而是採用更加符合應用的資料結構來排序。
#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...