1,排序的概念及其應用
概念:所謂排序,就是使一串記錄,按照其中的某個或某些關鍵字的大小,遞增或遞減的排列起來的操作.
常見的排序演算法:
2,常見排序演算法的實現
1.插入排序:
把待排序的記錄按其關鍵碼值的大小逐個插入到乙個已經排好序的有序序列中,知道所有的記錄插入完為止,得到乙個新的有序序列.
(1)直接插入排序:
在插入第i個元素時,與前面已經排好的元素進行比較,找到插入位置插入,原來位置上的元素後移。
**實現:
//插入排序
void insertsort(int array,int size)
//插入元素
array[end + 1] = key;
} return;
}
特性總結:
1.元素越接近有序,直接插入排序演算法的時間效率越高
2.時間複雜度:o(n^2)
3.空間複雜度:o(1)
3.穩定性:穩定
(2)希爾排序
基本思想:先選定乙個整數,然後把元素分組,對每組內的元素進行排序。然後縮小這個整數,重複。直到為1時,排好序;
**實現:
//希爾排序
void shellsort(int a,int size)
//插入元素
a[end + gap] = key;
} gap /= 2;
}}
希爾排序的特性總結:
1,希爾排序是對直接插入排序的優化
2,當gap>1時都是預排序,目的是讓陣列更接近有序。當gap==1時,陣列已經接近有序,這樣就會很快,就整體而言,這樣可以達到優化的效果。
3,希爾排序的時間複雜度需要推導,大約為o(n^1.3),
4,穩定性:不穩定
2.選擇排序:
基本思想:每一次從待排序的元素中選出最小的(或最大的乙個元素),存放在序列的起始位置,直到全部排序的資料元素排完。
(1)直接選擇排序:
<1>在元素集合a[i]–a[n-1]中選擇關鍵碼最大(小)的資料元素
<2>若他不是這組資料最後乙個(最前乙個)元素,則與這組元素最後乙個(最前乙個)交換。
<3>在剩餘的啊[i]–a[n-2]中重複上述操作;
**實現:
//選擇排序
void selectsort(int a, int size)
swap(&a[max], &a[size - 1]);
--size;
}}
直接選擇排序特性總結:
1.效率不好,實際中很少用到
2.時間複雜度o(n^2)
3.空間複雜度o(1)
4.穩定性:不穩定
(2)堆排序
堆排序是指利用堆這種資料結構設計的一種排序演算法,它是通過堆來進行選擇資料
**實現:
//堆排序
void heapadjust(int* array, int size, int parent)
else
return; }}
void heapsort(int* array, int size)
}
堆排序特性總結:
1,時間複雜度:o(n*logn)
2,空間複雜度:o(1)
3,穩定性:不穩定
3,交換排序:
基本思想:就是根據序列中兩個記錄鍵值的比較結果來對換這兩個紀錄在序列中的位置
(1)氣泡排序:
//氣泡排序
void bubblesort(int a, int size)
}}
氣泡排序優化:
void bubblesort1(int a, int size)
}if (flag == 1)
break;
}}
氣泡排序再優化:
void bubblesort2(int a, int size)
} cur = num;
if (flag)
break;
}}
氣泡排序特性總結:
1,時間複雜度:o(n^2)
2,空間複雜度:o(1)
3,穩定性:穩定
(2)快速排序:
基本思想:任取待排序元素序列中的某元素作為基準值,按照該排序碼將待排序集合分割成兩個子串行,左子串行中的值均小於基準值,右子串行中得值均大於基準值,然後左右子串行重複該過程,直到所有元素都排列在相信位置上。
**實現:
將區間劃分為2部分的常見方式:
1,hoare版本:
//快速排序
int pation1(int* array, int left, int right)
swap(&array[begin], &array[right - 1]);
return begin;
}
2,挖坑法:
//挖坑法
int pation2(int* array, int left, int right)
//讓end從後往前找比基準值小的元素
while (begin=key)
--end;
if (begin < end)
}array[begin] = key;
return begin;
}
3,前後指標:
//前後指標
int pation3(int* array, int left, int right)
++cur;
} ++prev;
swap(&array[prev], &array[right - 1]);
return prev;
}
快速排序遞迴:
//[left,right)
void quicksort(int* array, int left, int right)
}
迴圈:
//迴圈
void quicksort(int* array,int size)
}}
快排特性總結:
1,時間複雜度:o(n*logn) (最優) o(n^2) (最差)
2,空間複雜度o(logn)
3,穩定性:不穩定
歸併排序:
基本思想:先使子串行有序,再使子串行段間有序。就是將序列分為兩部分,使這兩部分都有序,在合併。
**實現:
//歸併排序
void mergedata(int* array,int left,int mid,int right,int* temp)
while(begin1遞迴的方式:
void _mergesort(int* array, int left, int right, int* temp)
}void mergesort(int* array, int size)
迴圈的方式:
//迴圈
void _mergenor(int* array, int size)
memcpy(array, temp, size * sizeof(array[0]));
gap *= 2;
}}
歸併排序特性總結:
1,時間複雜度:o(n*logn)
2,空間複雜度:o(n)
3,穩定性:不穩定
資料結構 排序
小小總結了下 希望別不記得 排序型別 排序方法 平均時間 最壞時間 最好時間 穩定空間 插入直接插入 o n2 o n2 o n 穩定o 1 希爾排序 o n3 2 增量序列最後為1,只有公因子1 不穩o 1 選擇簡單選擇 o n2 o n2 o n 穩定o 1 堆排序o n lb n o n lb...
資料結構 排序
郝斌版 資料結構 學習筆記 冒泡 公升序,12比,大放後面,再23比,直至最大的在最後面 插入 2,3,4,依次插入值,保證插入值後的序列為有序的 選擇 後面所有的最小值依次排到最前 快速排序 歸併排序 22排,44排,88排.排序演算法標準 時間,空間,穩定性 排序和查詢的關係 排序是查詢的前提,...
資料結構 排序
1.希爾排序 shellsort 增量序列d n為要排序數的個數 void shellinsertsort int a,int n,int dk n個要排序的數,dk是增量 2 堆排序 已知h s m 除了h s 外均滿足堆的定義 調整h s 使其成為大頂堆.即將對第s個結點為根的子樹篩選,para...