七大排序演算法

2021-08-09 07:52:03 字數 3327 閱讀 8603

基本思想

設要排序的陣列是a[0]……a[n-1],首先任意選取乙個資料(通常選用陣列的第乙個數)作為關鍵資料,然後將所有比它小的數都放到它前面,所有比它大的數都放到它後面,這個過程稱為一趟快速排序

時空複雜度
快速排序的最壞時間為o(n^2)

平均時間複雜度為o(nlgn)

在初始陣列近乎有序的狀態下最耗時

/*

* 快速排序

*/public

static

void

quicksort(int arr, int low, int high)

}public

static

intpartition(int arr, int left, int right)

while (arr[high] > key)

if (low < high)

}arr[left] = arr[high];

arr[high] = key;

return high;

}

基本原理
相鄰的數字兩兩進行比較,按照從小到大或者從大到小的順序進行交換,這樣一趟過去後,最大或最小的數字被交換到了最後一位,然後再從頭開始進行兩兩比較交換,直到排序結束

時空複雜度
氣泡排序最好的時間複雜度為o(n)

最壞時間複雜度為o(n^2)

平均時間複雜度為o(n^2)。

/*

* 改進型氣泡排序

* 時間複雜度最好為o(n),最差為o(n2)

*/public

static

void

bubblesort(int arr)

}pass--;

}}

基本原理
在要排序的一組數中,選出最小(或者最大)的乙個數與第1個位置的數交換;然後在剩下的數當中再找最小(或者最大)的與第2個位置的數交換,依次類推,直到第n-1個元素(倒數第二個數)和第n個元素(最後乙個數)比較為止。

時空複雜度
平均時間複雜度為o(n^2)。

/*

* 選擇排序

* 時間複雜度為o(n2) 空間複雜度為o(1)

*/public static void selectsort(int arr)

}temp = arr[i];

arr[i] = arr[min];

arr[min] = temp;

}}

基本原理
將乙個記錄插入到已排序好的有序表中,從而得到乙個新,記錄數增1的有序表。即:先將序列的第1個記錄看成是乙個有序的子串行,然後從第2個記錄逐個進行插入,直至整個序列有序為止。

時空複雜度
最好的時間複雜度為o(n)

最壞時間複雜度為o(n^2)

平均時間複雜度為o(n^2)。

/*

* 插入排序

*/public

static

void

insertsort(int arr) else

}arr[j+1] = temp;

}}

基本原理
歸併(merge)排序法是將兩個(或兩個以上)有序表合併成乙個新的有序表,即把待排序序列分為若干個子串行,每個子串行是有序的。然後再把有序子串行合併為整體有序序列。

時空複雜度
平均時間複雜度為o(nlogn)。

/*

* 歸併排序

*/public

static

void

mergesort(int arr,int low,int high)

}private

static

void

merge(int arr,int low,int mid,int high) else

}while(i<=mid)

while(j<=high)

for(i=low,k=0;i<=high;i++,k++)

}

基本原理
先將整個待排序的記錄序列分割成為若干子串行分別進行直接插入排序,待整個序列中的記錄「基本有序」時,再對全體記錄進行依次直接插入排序。

時空複雜度
希爾排序的時間複雜度與增量序列的選取有關

/*

* 希爾排序

*/public static void shellsort(int arr)

arr[k+step] = temp;}}

}

}}

基本原理
初始時把要排序的n個數的序列看作是一棵順序儲存的二叉樹(一維陣列儲存二叉樹),調整它們的儲存序,使之成為乙個堆,得到n 個元素中最小(或最大)的元素,這時堆的根節點的數最小(或者最大)。將堆頂元素跟堆中最後乙個元素交換,然後對前面(n-1)個元素重新調整使之成為堆,得到n 個元素中次小(或次大)的元素。依此類推,直到只有兩個節點的堆,並對它們作交換,最後得到有n個節點的有序序列。稱這個過程為堆排序。

時空複雜度
平均時間複雜度為o(nlogn)。

/*

* 堆排序

*/public

static

void

heapsort(int arr)

// 進行n-1次迴圈,完成排序

for (int i = arr.length - 1; i > 0; i--)

}private

static

void

buildheap(int arr,int parent,int length)

if (temp >= arr[child])

break;

arr[parent] = arr[child];

arr[child] = temp;

// 選取孩子結點的左孩子結點,繼續向下建堆

parent = child;

child = 2 * child + 1;

}arr[parent] = temp;

}

七大排序演算法

氣泡排序 void bubble int a,int n 選擇排序 void select sort int a,int n n為陣列a的元素個數 將第i 小的數,放在第i 個位置 如果剛好,就不用交換 if i min index 插入排序 typedef int elementtype void...

七大排序演算法

七大排序分類 插入排序 直接插入排序 穩定 希爾排序 不穩定 選擇排序 簡單選擇排序 穩定 堆排序 不穩定 交換排序 氣泡排序 穩定 快速排序 不穩定 歸併排序。直接插入排序 時間複雜度 o n 2 演算法穩定性 穩定void straightinsertsort int a,int n 氣泡排序 ...

七大排序演算法

首先回顧下各種排序的主要思路 一 氣泡排序 氣泡排序主要思路是 通過交換使相鄰的兩個數變成小數在前大數在後,這樣每次遍歷後,最大的數就 沉 到最後面了。重複n次即可以使陣列有序。氣泡排序改進1 在某次遍歷中如果沒有資料交換,說明整個陣列已經有序。因此通過設定標誌位來記錄此次遍歷有無資料交換就可以判斷...