[排序] 1 內部排序-總結
阿新 • • 發佈:2018-12-15
直接插入排序
void InsertSort(int arr[], int n) {
int tmp, i, j;
for (i=1; i<n; ++i) {
tmp = arr[i];
j=i-1;
while (j>=0 && tmp<arr[j] ) {
arr[j+1] = arr[j];
--j;
}
arr[j+1] = temp;
}
}
希爾排序
void ShellSort(int arr[], int n) {
int temp,i,j;
int gap;
for (gap=n/2; gap> 0; gap/=2) {
for (i=gap; i<n; ++i) {
temp = arr[i];
int j;
for (j=i; j>=gap && arr[j-gap]>temp; j-=gap) {
arr[j] = arr[j-gap];
}
arr[j] = temp;
}
}
}
簡單選擇排序
void SelectSort(int arr[], int n) {
int i,j,k;
int temp;
for (i=0; i<n; i++) {
k =i;
for (j=i+ 1; j<n; ++j) {
if (arr[k] > arr[j])
k =j;
}
temp = arr[i];
arr[i] = arr[k];
arr[k] = temp;
}
}
堆排序
用堆來選擇最大最小的關鍵字,再插入
氣泡排序
每一次把最大的關鍵字移到了最右邊,像氣泡從水底冒到了水面一樣
void BubleSort(int arr[], int n) {
int i,j,flag;
int tmp;
for (i=n-1; i>=1; --i) {
flag = 0;
for (j=1; j<=i; ++j) {
if (arr[j-1] > arr[j] ) {
tmp = arr[j];
arr[j] = arr[j-1];
arr[j-1] = temp;
flag = 1;
}
}
if (flag ==0 ) return ;
}
}
快速排序
//low,high 當前子序列的範圍
void QuickSort(int arr[], int low, int high) {
int temp;
int i = low, j=high;
if (low<high) {
temp = arr[low];
while (i<j) {
//滿足條件的情況下,將j往前移動
while (j>i && arr[j]>=temp) --j;
//把比tmp小的關鍵字賦值到i
if (i<j) {
arr[i] = arr[j];
++i;
}
//滿足條件的情況下,將i後移
while (i<j && arr[i]<temp) ++i;
//把 比tmp大的i 賦值到j上
if (i<j) {
arr[j] = arr[i];
--j;
}
}
arr[i] = tmp;
QuickSort(arr, low, i-1);
QuickSort(arr, i+1, high);
}
}