排序:就是將一組雜亂無章的資料按照一定的規律組織起來。
按照大類分為穩定排序和不穩定排序。穩定排序就是指兩個大小相同的順序在排序之後順序不變,而不穩定排序那就不一定了。
快速排序、希爾排序、堆排序、直接選擇排序不是穩定的排序演算法。
詳細**如下:
//在這裡:n(log2n)是指log以2為底n的對數
穩定排序的適用條件:1.本來就有序 2.陣列比較短
在這篇部落格中會詳細講到七種排序演算法,具體的過程在**中以注釋的形式體現:
1.氣泡排序:
兩層迴圈,相鄰元素進行比較
void bubblesort(int array, int size)
//迴圈套迴圈,大迴圈遍歷亂序的陣列,小迴圈在裡面進行交換。
//有序區間逐漸變長,無序區間逐漸變短。
int bound = 0;
//[0,bound)當前的有序區間 [bound,size)亂序排序
for (; bound < size; ++bound)
}return;
}
下面是測試**以及主函式,經過除錯結果無誤:
void testbubblesort() ;
bubblesort(array, sizeof(array) / sizeof(array[0]));
//列印陣列元素的函式也是提前寫好的,直接呼叫就可以
printarray(array, sizeof(array) / sizeof(array[0]));
}int main()
2.選擇排序:
打擂台的思想,和氣泡排序十分相似,都是兩層迴圈,但實際比較不一樣
void selectsort(int arr, int size)
//首先搭建出來乙個有序區間
int bound = 0;
for (; bound < size; ++bound)
} return;
}
3.插入排序:
(線性表)分成有序區間(0,bound)和待排序區間[bound,size},將後面的元素嘗試插入有序線性表的合理位置。類似撲克牌洗牌的過程。移動的都是位置,而不是具體的數值。
void insertsort(int arr, int size)
//將bound位置的元素插入到前面線性表的合理位置
int bound = 0;
for (; bound < size; ++bound)
else
} arr[i] = bound_value;//當i等於0時,迴圈退出
}}
4.堆排序(公升序用大堆、降序用小堆)其重點在於堆的建立和刪除
(1)建立大堆(上浮式 從前往後遍歷、下沉式 需要從後往前遍歷);
(2)迴圈刪除堆頂元素(1、將堆頂根結點和末尾元素進行交換,此時末尾就是最大值,2、重新調整堆結構,再次調整堆頂元素和末尾元素,3、不斷重複此步驟,直至滿足堆的性質,變得有序)
void adjustdown(int arr, int size, int index)//然後和父節點進行比較
if (arr[child]>arr[parent])
else
parent = child;//作為新的起始節點
child = 2 * parent + 1;
} return;
}void heapcreate(int arr, int size)
//下沉式調整,從最後乙個非葉子節點往前遍歷
//size-1就是最後乙個元素的下標
int i = (size - 1 - 1) / 2;//當前元素的父節點
for (; i >= 0; --i)
} if (size <= 1)
//交換堆頂元素和末尾元素
swap(&arr[0], &arr[size - 1]);
down(arr, size - 1, 0);
}void heapsort(int arr, int size)
// 1. 建立大堆,呼叫函式
heapcreate(arr, size);
// 2. 迴圈刪除堆頂元素
// 每次刪除乙個元素, 就把當前的最大值放到陣列末尾了
int i = 0;
for (; i < size; ++i)
}
5.希爾(shell)排序:(以人名命名的一種演算法),一種改進版本的插入排序
思路:將資料分組,每一組再進行插入排序
gap步長即是組數,組內排序成功,再依次交替組成乙個新的陣列(插入排序)
下列情況效果比較好:長度n 步長n/2,n/4,n/8...1
void shellsort(int arr, int size)
int gap = size / 2;
for (; gap >= 1; gap /= 2)
else
}arr[i] = bound_value;
} }return;
}
6.歸併排序(merger):分治思想,利用遞迴和迭代演算法
物件導向:兩個有序的陣列
思路:申請乙個可以放下兩個陣列的空間,對於兩個陣列的開頭設定兩個指標,比較指標所指向的數字大小,小的直接放入新的陣列,指標順應後移。
7.快排:找到乙個基準值
第乙個下標從前往後遍歷,嘗試找到第乙個大於基準值的元素,第二個下標從後往前遍歷,嘗試找到第乙個小於基準值的元素,相同就交換位置。
資料結構 排序演算法
include include define maxitem 100 typedef char keytype 5 typedef int elemtype typedef struct rec elemnode maxitem 氣泡排序演算法 void bubblesort elemnode r,...
資料結構 排序演算法
排序演算法分為內部排序和外部排序兩大類。內部排序 在計算機記憶體中完成的排序演算法 外部排序 不能再記憶體中文完成,必須在磁碟或者磁帶上完成的排序演算法 內部排序是研究的重點問題,通常我們講的八大排序演算法也主要是講的內部排序演算法。排序演算法的穩定性和時間空間複雜度 本文重點介紹以下幾種排序演算法...
資料結構 排序演算法
直接插入排序是指將r i r n 插入到已經有序的r 1 r i 1 序列中。r 0 是乙個哨兵,起到作為邊界條件並作為暫存單元的作用。實際上,一切為簡化邊界條件而引入的附加節點 元素 均可稱為哨兵。例如單鏈表中的頭結點。對於有n個記錄的集合,要進行n 1趟排序。其最優時間複雜度是o n 平均時間複...