這是相當簡單的排序方式,在具體實現的時候會有不同,具體有以下的兩個實現:
//實現1
void insert_sort(int *arr, int length)
} for (k = i - 1; k >= j; k--)
arr[j] = tmp;
}}
//實現2,推薦使用
//最差為o(n^2),最好為o(1) 演算法穩定 完全有序為o(n)
void insert_sort(int *arr, int length)
arr[j + 1] = arr[j];
} arr[j+1] = tmp;
}}
//gap增量,即組數也是間隔值
void shell(int *arr, int length, int gap)
arr[j + gap] = arr[j];
} arr[j + gap] = tmp; }}
void shellsort(int *arr,int length)//o(n^1.3)~o(n^1.5), 最好能達到o(1),不穩定
;//縮小增量,最後乙個數值為1
for (int i = 0; i < sizeof(brr) / sizeof(brr[0]); i++)
}
void bubblesort(int *arr, int length)//穩定
} }}
堆排序需要說明一下,具體如下圖:int partition(int *arr, int start, int end)
arr[low] = tmp;
return low;
}//遞迴實現
static void quick(int *arr, int start, int end)
if (par+1 < end) //右側 }
void quicksort(int *arr, int length)//最差o(nlogn),最好o(logn),不穩定
**實現如下:
//樹中左右節點的和父節點的關係:左孩子是父節點的2k+1 右節點是父節點的2k+2, k為父節點下標
void heapadjust(int *arr, int start, int end)
else
}//上述迴圈找到tmp的位置,放入
arr[parent] = tmp;
}void heapsort(int *arr, int length)//不穩定
for (i = 0; i < length - 1; i++)
}
//gap為歸併段的長度
void merge(int *arr, int length, int gap)
// 第乙個歸併段還有資料
while (low1 <= high1)
while (low2 <= high2)
low1 = high2 + 1;
high1 = low1 + gap - 1;
low2 = high1 + 1;
high2 = low2 + gap < length ? low2 + gap - 1 : length - 1;
}//只剩乙個歸併段處理(可能是兩兩結合剩餘了乙個或者是歸併段的長度正好為本陣列長度,但後者可能性小)
while (low1 < length)
//將結果重新拷貝回原陣列
for (i = 0; i < length; i++)
free(brr);
}void mergesort(int *arr, int length)//o(nlogn),o(n),穩定
}
//選擇排序,不穩定 o(1)~o(n^2)
void selectsort(int *arr,int len)
} if(i != minindex)}}
常見排序演算法的實現
在電腦科學與數學中,排序演算法是一種基本並且常用的演算法,乙個排序演演算法是一種能將一串資料依照特定排序方式的一種演演算法。有效的排序演演算法在一些演算 法中是重要的,如此這些演演算法才能得到正確解答。排序演演算法也用在處理文字資料以及產生人類可讀的輸出結果。由於實際工作中處理的數量巨大,所以排序演...
常見排序演算法的實現
在電腦科學與數學中,排序演算法是一種基本並且常用的演算法,乙個排序演演算法是一種能將一串資料依照特定排序方式的一種演演算法。有效的排序演演算法在一些演演算法中是重要的,如此這些演演算法才能得到正確解答。排序演演算法也用在處理文字資料以及產生人類可讀的輸出結果。由於實際工作中處理的數量巨大,所以排序演...
常見排序演算法的實現
插入排序是最簡單最直觀的排序演算法了,它的依據是 遍歷到第n個元素的時候前面的n 1個元素已經是排序好的了,那麼就查詢前面的n 1個元素把這第n個元素放在合適的位置,如此下去直到遍歷完序列的元素為止。演算法的複雜度也是簡單的,排序第乙個需要1的複雜度,排序第二個需要2的複雜度,因此整個的複雜度就是 ...