目錄
氣泡排序
選擇排序
插入排序
shell排序
歸併排序
快速排序
堆排序
void bubblesort(int arr,int _size)}}
}
/*
每一輪迴圈都把最小的數放在陣列的前半部分
*/void selectsort(int arr, int _size)
}if (arr[min] != arr[i])//如果min已被更新
}}
/*
插入排序
1.從第二個元素開始,標記該元素
2.逐個與前面的數比較
3.最後再把標記的元素放入合適位置
時間複雜度o(n^2)
*/
void insertionsort(int arr, int _size)
arr[j + 1] = key;
}}
1.先定好步長step * 3 + 1
2.以當前步長逐個向後比較
3.縮步長
void shellsort(int arr, int _size)
while (step>0)
//當把步長內大於key的全部元素放到後面,再安置key
arr[j + step] = key;
}step = (step - 1) / 3;//一輪挪完後
}}
1.定義乙個第三方
2.一邊從起始位置開始,一邊從中間開始,比較小的先加入第三方
3.如果陣列個數為奇數,看最後哪一方還剩下乙個
4.把剩下的加進去
void merge(int arr, int start, int end, int mid)
while (i <= mid)//如果j先結束
while (j <= end)//如果i先結束
for (i = 0; i < len; i++)
}//遞迴
void mergesortrecur(int arr, int start,int end)
int mid = (start + end) >> 1;
mergesortrecur(arr, start, mid);
mergesortrecur(arr, mid+1, end);
merge(arr, start, end, mid);
}//非遞迴
void mergesortiter(int arr, int size)
}}
void quicksort(int arr, int start, int right)//先全體找出index
int index = arr[start];//將最左邊的數作為基準值,這點要求了必須從右邊開始
int i = start;
int j = right;
while (i != j)
while (arr[i] <= index&&i < j)
if (iarr[max])//找較大的子節點
if (right < size&&arr[right]>arr[max])//找較大的子節點
if (max != index)
}void adjustdown(int arr, int index, int size)
if (arr[index] < arr[child])//因為是從底層往上把那個較小值上調的,所以這時候的index往下之
前已經調整過了
swap(&arr[index], &arr[child]);//走到這裡說明沒有進入上乙個if,此時的根節點比子節點大
index = child;//子節點做根節點繼續往下調整
child = index * 2 + 1;
}}void makeheap(int arr, int size)//建堆
}void heapsort(int arr, int size)
}
資料結構之排序
在待排序的檔案中,若存在多個關鍵字相同的記錄,經過排序後這些具有相同關鍵字的記錄之間的相對次序保持不變,該排序方法是穩定的 若具有相同關鍵字的記錄之間的相對次序發生變化,則稱這種排序方法是不穩定的。穩定的排序 時間複雜度 空間複雜度 氣泡排序 最差和平均是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 ...