1. 氣泡排序
基本思想:它重複地走訪要排序的數列,一次比較兩個元素,如果他們的順序錯誤就把他們交換過來。直到沒有再需要交換,也就是說該數列已經排序完成。
假設有乙個大小為 n 的無序序列。以公升序氣泡排序為例,氣泡排序就是要每趟排序過程中通過兩兩比較相鄰元素,將小的數字放到前面,大的數字放在後面。
空間複雜度:o(n)
時間複雜度:o(n^2)
穩定排序
void swap(int *a, int *b)
void print(int
array, int size)
printf("\n");
}void bubblesort(int
array, int size)}}
print(array, size);
return;
}
基本思想:相當於打擂台,將初始時在序列中找到最小元素,放到擂台上;然後,再將剩餘未排序元素與擂台上數字比較,若比擂台上數字小,就交換,然後將擂台上的數字作為有序序列放在開頭,以此類推,直到所有元素均排序完畢。
空間複雜度:o(n)
時間複雜度:o(n^2)
不穩定排序
//打擂台 array[bound](最小值)放在擂台上,若比擂台上數小,交換。
void selectsort(int
array, int size)}}
print(array, size);
return;
}
基本思想:每一步將乙個待排序的元素,按其排序碼的大小,插入到前面已經排序好的元素的合適位置上去,直到元素全部插完為止。
演算法過程:
空間複雜度:o(1)
時間複雜度:o(n^2)
穩定排序
如果陣列中有序數較多或者陣列的長度較短,則插入排序的效率更高。
void insertsort(int
array, int size)
else
}array[i] = bound_val;
}print(array, size);
return;
}
基本思想:先將整個待排序的記錄序列分割成為若干子串行分別進行直接插入排序。
如圖所示:
希爾序列最優序列時間複雜度為:o(n^1.3)
空間複雜度:o(1);
不穩定排序
void shellsort(int
array, int size)
else
}array[i] = bound_val;}}
print(array, size);
return;
}
基本思想:指利用堆這種資料結構所設計的一種排序演算法。
公升序—建大堆,降序—-建小堆
執行如下步驟:
- 把堆頂元素array和當前大堆的最後乙個元素交換;
- 堆元素個數減1;
- 向下調整根節點
重複該過程。
時間複雜度:o(nlogn);
空間複雜度:o(1);
不穩定排序
void adjustdown(int array, int
size, int proot)
if (array[proot] < array[max])
proot = max;
}return;
}void heapcreate(int array, int
size)
}void heapsort(int array, int
size)
print(array, size);
return;
}
基本思想:將待排序的元素序列分成兩個長度相等的子串行,對每乙個子串行排序,然後將他們合併成乙個序列。
如圖:
時間複雜度: o(nlogn)
空間複雜度: 對於陣列來說, o(n)
穩定性: 穩定排序
void mergearray(int
array, int begin, int mid, int end, int *tmp)//實現歸併的功能
else
}//有的陣列沒有走完,把該陣列剩下的元素加到tmp後邊
while (cur1 < mid)
while (cur2 < end)
//把快取區的數拷貝到array中
memcpy(array+begin, tmp+begin, sizeof(int)*(end - begin));
}//非遞迴實現
void mergesortloop(int
array, int size)
}free(tmp);
}//遞迴實現
void _mergesort(int
array, int begin, int end, int *tmp)//該函式完成遞迴
void mergesort(int
array, int size)
基本思想:任取待排序元素序列中的某個元素作為基準值,按照該排序碼將待排序集合分割成兩子串行,左子串行中所有元素均小於基準值,右子串行中所有元素均大於基準值,然後最左右子串行重複該過程,直到所有元素都排列在相應位置上為止。
快速排序使用分治策略來把乙個序列分為兩個子串行。步驟為:
時間複雜度:最壞情況下為o(n^2),平均為o(nlogn)
空間複雜度:o(n)
不穩定排序
int partion(int
array, int begin, int end)
while (left < right&&array[right] >= tmp)//讓right從右往左找第乙個小於基準值的數
//這兩個迴圈結束後,表示left 就指向了第乙個大於 基準值 的元素,right 就指向了第乙個小於 基準值 的元素
if (left < right)
}//當left和right重合時,將其與基準值交換
swap(&array[left], &array[end - 1]);
return left;
}void _quicksort(int
array, int begin, int end)
void quicksort(int
array, int size)
重點:
如何證明 left 和 right 重合之後, left 指向的元素一定大於等於基準值呢?
情況有兩種:
1. 由於 ++left, 導致 left 和 right 重合
此時就看 right 之前指向的元素是否是大於等於基準值的元素
結合第二個迴圈和swap操作, right也指向了乙個大於基準值的元素
2. 由於 –right, 導致 right 和 left 重合
此時就看 left 之前指向的元素是否是大於等於基準值的元素
結合第乙個迴圈, 確實 left 指向了乙個大於等於基準值的元素
資料結構之排序
在待排序的檔案中,若存在多個關鍵字相同的記錄,經過排序後這些具有相同關鍵字的記錄之間的相對次序保持不變,該排序方法是穩定的 若具有相同關鍵字的記錄之間的相對次序發生變化,則稱這種排序方法是不穩定的。穩定的排序 時間複雜度 空間複雜度 氣泡排序 最差和平均是o n2 最好是o n 1 雙向氣泡排序 最...
資料結構之排序
package com.small 注意a 0 是否有意思,書上c語言基本都是將a 0 作為哨兵,那麼0號元素不能用,我這裡全部是flag代替 author small leaf public class sort else for j i 1 j high 1 j a high 1 flag 希爾...
資料結構之排序
常用的幾種排序方法 冒泡 插入 選擇 快排 歸併排序 1 冒泡 以公升序為例,也是有兩種思路,1 num 0 依次與後面比較將最小的放到第一位 2 將最大的放到最後一位。我比較習慣用第一種 1 include include using namespace std int main for int ...