七種基本排序

2021-09-25 11:09:14 字數 4238 閱讀 4522

排序: 所謂排序, 就是使一串記錄,按照其中的某個或某些關鍵字的大小,遞增或遞減的排 列起來的操作。

穩定性:假定在待排序的記錄序列中,存在多個具有相同的關鍵字的記錄,若經過排序,這

些記錄的相對次 序保持不變,即在原序列中,r[i] = r[j],且r[i]在r[j]之前,而在排序後的序列中,r[i]仍在r[j]之前,則稱這種排 序演算法是穩定的;否則稱為不穩定的。

內部排序:資料元素全部放在記憶體中的排序。

外部排序:資料元素太多不能同時放在記憶體中,根據排序過程的要求不能在內外存之間移動資料的排序

1.1直接插入排序

1.1.1基本思想:

直接插入排序是一種簡單的插入排序法,其基本思想是:把待排序的記錄按其關鍵碼值的大小逐個插到一 個已經排好序的有序序列中,直到所有的記錄插入完為止,得到乙個新的有序序列。

1.1.2**實現

#include#includevoid insert(int a, int size)

a[j + 1] = k; }}

void printa(int a, int size)

printf("\n");

}int main();

int size = sizeof(a) / sizeof(int);

insert(a, size);

printa(a, size);

system("pause");

}

1.1.3直接插入排序的特性總結:

元素集合越接近有序,直接插入排序演算法的時間效率越高

時間複雜度:o(n ^ 2)

空間複雜度:o(1),它是一種穩定的排序演算法

穩定性:穩定

1.2希爾排序(縮小增量排序)

1.2.1基本思想

希爾排序法又稱縮小增量法。希爾排序法的基本思想是:先選定乙個整數,把待排序檔案中所有記錄成個 組,所有距離為的記錄分在同一組內,並對每一組內的記錄進行排序。然後,取,重複上述分組和序的工 作。當到達 = 1時,所有記錄在統一組內排好序。

1.2.2**實現

void shellsort(int a,int size)    

a[j + gap] = k; }

if (gap == 1)

}}

2.1基本思想:

每一次從待排序的資料元素中選出最小(或最大)的乙個元素,存放在序列的起始位置,直到全部待排序的 資料元素排完。

2.2.1直接選擇排序

在元素集合array[i]–array[n-1]中選擇關鍵碼最大(小)的資料元素 若它不是這組元素中的最後乙個(第乙個)元素,則將它與這組元素中的最後乙個(第乙個)元素交換 在剩餘的array[i]–array[n-2](array[i+1]–array[n-1])集合中,重複上述步驟,直到集合剩餘1個元素。

2.2.2**實現

//直接選擇排序

void selectsort(int a, int size)

if (a[i] > a[max])

} swap(&a[min], &a[left]);

if (max == left)

swap(a + max, a + right);

left++;

right--;

}}

2.2.3直接選擇排序特性總結:

直接選擇排序思考非常好理解,但是效率不是很好。實際中很少使用

時間複雜度:o(n^2)

空間複雜度:o(1)

穩定性:不穩定

2.3.1堆排序基本思想

堆排序(heapsort)是指利用堆積樹(堆)這種資料結構所設計的一種排序演算法,它是選擇排序的一種。它是 通過堆來進行選擇資料。需要注意的是排公升序要建大堆,排降序建小堆。

2.3.2**實現

// 堆排序

void heapify(int a, int size, int index)

int max = left;

if (right < size && a[right] > a[left])

if (a[index] >= a[max])

swap(a + index, a + max); //交換兩個值

heapify(a, size, max);

}void createheap(int a, int size)

}void heapsort(int a, int size)

}

2.3.3直接選擇排序的特性總結:

堆排序使用堆來選數,效率就高了很多

時間複雜度:o(n*logn)

空間複雜度:o(1)

穩定性:不穩定

3.1氣泡排序

3.1.1基本思想

所謂交換,就是根據序列中兩個記錄鍵值的比較結果來對換這兩個記錄在序列中的位置,交換排 序的特點是:將鍵值較大的記錄向序列的尾部移動,鍵值較小的記錄向序列的前部移動

3.1.2**實現

void maopao(int a,int size)

}if(s==1)

}}

3.1.3氣泡排序的特性總結:

氣泡排序是一種非常容易理解的排序

時間複雜度:o(n^2)

空間複雜度:o(1)

穩定性:穩定

3.2快速排序

3.2.1基本思想

快速排序是hoare於2023年提出的一種二叉樹結構的交換排序方法,其基本思想為:任取待排序元素序列中 的某元素作為基準值,按照該排序碼將待排序集合分割成兩子串行,左子串行中所有元素均小於基準值,右 子串行中所有元素均大於基準值,然後最左右子串行重複該過程,直到所有元素都排列在相應位置上為止。

3.2.2**實現

// 快速排序

int partition1(int a, int left, int right)

while (begin < end && a[end] >= pivot)

swap(a + begin, a + end);

} swap(a + begin, a + right);

return begin;

}// [left, right]

void quicksortinternal(int a, int left, int right)

// 1. 確定基準值,最右邊 a[right]

// 2. 做 partition,小的左,大的右,返回基準值最終的下標

int pivotindex = partition3(a, left, right);

// 3. 分治處理左右兩個小區間

quicksortinternal(a, left, pivotindex - 1);

quicksortinternal(a, pivotindex + 1, right);

}

3.2.3快速排序的特性總結:

快速排序整體的綜合性能和使用場景都是比較好的,所以才敢叫快速排序

空間複雜度:o(logn)

時間複雜度:o(n*logn)

穩定性:不穩定

3.1.1基本思想

歸併排序(merge-sort)是建立在歸併操作上的一種有效的排序演算法,該演算法是採用分治法(divide and conquer)的乙個非常典型的應用。將已有序的子串行合併,得到完全有序的序列;即先使每個子串行有 序,再使子串行段間有序。若將兩個有序表合併成乙個有序表,稱為二路歸併。

3.1.2**實現

// 歸併排序

void mergesortinternal(int a, int low, int high)

int mid = (low + high) / 2;

// [low, mid)

// [mid, high)

mergesortinternal(a, low, mid);

mergesortinternal(a, mid, high);

// 3. 合併兩個有序區間

// [low, mid) [mid, high)

merge(a, low, mid, high);

}

3.1.3歸併排序的特性總結:

歸併的缺點在於需要o(n)的空間複雜度,歸併排序的思考更多的是解決在磁碟中的外排序問題。

時間複雜度:o(n*logn)

空間複雜度:o(n)

穩定性:穩定

七種基本排序(2) 快速排序

快速排序思想就是找到乙個基準值,然後讓比它小的在它前面,比它大的在它後面 然後用遞迴思想解決比它小的一部分和比它大的一部分區間 partiton作用 分割 index 記錄基準值的下標位置 public static void quicksort int array public static vo...

七種排序方法

一 快速排序 1.簡單介紹 快速排序是由東尼 霍爾所發展的一種排序演算法。在平均狀況下,排序 n 個專案要 n log n 次比較。在最壞狀況下則需要 n2 次比較,但這種狀況並不常見。事實上,快速排序通常明顯比其他 n log n 演算法更快,因為它的內部迴圈 inner loop 可以在大部分的...

七種排序方法

一 快速排序 1.簡單介紹 快速排序是由東尼 霍爾所發展的一種排序演算法。在平均狀況下,排序 n 個專案要 n log n 次比較。在最壞狀況下則需要 n2 次比較,但這種狀況並不常見。事實上,快速排序通常明顯比其他 n log n 演算法更快,因為它的內部迴圈 inner loop 可以在大部分的...