常用排序算法(C语言描述)
冒泡排序
void BubbleSort(int a[], int n)
{
int i, j;
for (i = 0; i < n; i++) {
for (j = i+1; j < n; j++) {
if (a[i] > a[j]) {
int t = a[i];
a[i] = a[j];
a[j] = t;
}
}
}
}
选择排序
void SelectSort(int a[], int n)
{
int i, j, min;
for (i = 0; i < n; i++) {
min = i;
for (j = i+1; j < n; j++) {
if(a[min] > a[j]) {
min = j;
}
}
if (min != i){ //a[i]这一轮的不是最小值
int t = a[min];
a[min] = a[i];
a[i] = t;
}
}
}
插入排序
void InsertSort(int a[], int n)
{
int i, j, tmp;
for (i = 1; i < n; i++) { //从第2个数开始
if (a[i] < a[i-1]) {
tmp = a[i];
for (j = i; j > 0 && tmp < a[j-1]; j--) {
a[j] = a[j-1];
}
a[j] = tmp;
}
}
}
希尔排序
void ShellSort(int a[], int n)
{
int gap,i,j;
for (gap = n/2; gap > 0; gap /=2) {
//下面是插入排序,只不过间隔是gap,而不是固定值1
for (i = gap; i < n; i++) {
if (a[i] < a[i-1]) {
int tmp = a[i];
for (j = i; j >= gap && tmp < a[j-gap]; j-=gap) {
a[j] = a[j-gap];
}
a[j] = tmp;
}
}
}
}
堆排序
#include<iostream>
using namespace std;
//调整为大顶堆
void AdjustHeap(int arr[], int index, int length) {
int tmp = arr[index];
for (int i = index*2+1; i < length; i = 2*i+1) {
//如果一个节点的左孩子存在,并且小于右孩子,那么比较的就是父节点和右孩子
//否则就是比较父节点和左孩子
if (i+1 < length && arr[i] < arr[i+1]) {
i++;
}
if (tmp < arr[i]) {
//如果左孩子或者右孩子比父节点大,那么就将父节点和大的子节点交换位置
arr[index] = arr[i];
index = i;
} else {
break;
}
}
arr[index] = tmp;
}
void Sort(int arr[],int length) {
//构建大顶堆
for (int i = length/2-1; i >= 0; i--) {
AdjustHeap(arr, i, length);
}
//交换堆顶元素和默认元素之后,再进行调整堆
for (int i = length-1; i > 0; i--) {
int t = arr[0];
arr[0] = arr[i];
arr[i] = t;
AdjustHeap(arr, 0, i);
}
}
int main() {
int arr[10] = {2,1,4,5,3,7,9,8,0,6};
Sort(arr, 10);
for (int i = 0; i < 10; i++) {
cout << arr[i] << " ";
}
cout << endl;
return 0;
}
归并排序
void Merge(int a[], int start, int mid, int end, int tmp[])
{
int s,e,cur,i;
s = start;
e = mid+1;
cur = 0;
while (s <= mid && e <= end) {
if (a[s] < a[e]) {
tmp[cur++] = a[s++];
} else {
tmp[cur++] = a[e++];
}
}
while (s <= mid) {
tmp[cur++] = a[s++];
}
while (e <= end) {
tmp[cur++] = a[e++];
}
for (i = 0; i < end-start+1; i++){
a[start+i] = tmp[i];
}
}
void MergeSort(int a[], int start, int end,int tmp[])
{
int mid;
if (start < end) {
mid = start + (end - start)/2;
MergeSort(a, start, mid, tmp);
MergeSort(a, mid+1, end, tmp);
Merge(a, start, mid, end, tmp);
}
}
快速排序
#include<stdio.h>
void swap(int a[], int i, int j)
{
int t = a[i];
a[i] = a[j];
a[j] = t;
}
void QuickSort(int a[], int start, int end)
{
if(start >= end){
return;
}
int i, j, k;
i = start;
j = end;
k = a[start];
while ( i !=j ) {
while (i < j && a[j] >= k) {
j--;
}
//找到一个在k的右边,并且比k小的数,所以把他们交换位置,让其在k的左边
swap(a, i, j);
while (i < j && a[i] <= k) {
i++;
}
//找到一个在k的左边,并且比k大的数,所以把他们交换位置,让其在k的右边
swap(a, i, j);
}
QuickSort(a, start, i);
QuickSort(a, i+1, end);
}
void printArr(int a[], int n)
{
int i;
for (i = 0; i < n; i++) {
printf("%d ",a[i]);
}
printf("\n");
}
int main()
{
int a[10] = {10,5,1,6,3,39,99,21,0,9};
printArr(a, 10);
QuickSort(a, 0, 9);
printArr(a, 10);
return 0;
}
桶排序
各种排序方式的时间和空间复杂度
各种排序方式的使用场景
如需转载,请注明文章出处,谢谢!!!
浙公网安备 33010602011771号