【C/C++】排序算法代码实现

这里,汇总了常见的排序算法具体代码实现。使用C语言编写。

排序算法实现

  • 插入排序
  • 冒泡排序
  • 选择排序
  • 快速排序
  • 希尔排序
  • 归并排序

插入排序

#include 
#include 

void InsertSort(int arr[],int n){
    int i,j,temp;
    for(i = 1;i < n;i++){   //将各元素插入已排好的序列中
        if(arr[i] < arr[i-1]){  //若当前元素小于前驱
            temp = arr[i];    //暂存当前元素
            for(j = i-1;j >= 0 && arr[j] > temp;j--)  //检查前面所有排好的元素
                arr[j+1] = arr[j];  //所有大于temp的元素后移
            arr[j+1] = temp;  //复制到插入位置(j+1:j--多减了一个要加回来)
        }
    }
}

int main()
{
    int a[] = {12,32,61,5,9,63,89,2};
    for(int i=0;i<8;i++)
        printf("%d ",a[i]);
    InsertSort(a,8);
    printf("\n");
    for(int i=0;i<8;i++)
        printf("%d ",a[i]);
    return 0;
}


冒泡排序

#include 
#include 

void bubbleSort(int arr[],int n){
    for(int i=0;i<n-1;i++){//外层循环,n个元素需要循环n-1次
        for(int j=0;j<n-1-i;j++){  //内层循环,n个元素第i趟比较n-i次
            if(arr[j]>arr[j+1]){  //将较大的元素后移
                int temp = arr[j+1];
                arr[j+1] = arr[j];
                arr[j] = temp;
            }
        }
    }
}

int main()
{
    int a[] = {12,32,61,5,9,63,89,2};
    for(int i=0;i<8;i++)
        printf("%d ",a[i]);
    bubbleSort(a,8);
    printf("\n");
    for(int i=0;i<8;i++)
        printf("%d ",a[i]);
    return 0;
}

选择排序

#include 
#include 

void selectSort(int a[],int n){
    int i,j,min = 0;
    for(i=0;i<n-1;i++){
        min = i;
        for(j=i+1;j<n;j++){
            if(a[j]<a[min]){  //寻找最小的数
                min = j;  //寻找最小的索引保存
            }
        }
        if(i!= min){
            int tmp = a[i];
            a[i] = a[min];
            a[min] = tmp;
        }
    }
}

int main()
{
    int a[] = {12,32,61,5,9,63,89,2};
    for(int i=0;i<8;i++)
        printf("%d ",a[i]);
    selectSort(a,8);
    printf("\n");
    for(int i=0;i<8;i++)
        printf("%d ",a[i]);
    return 0;
}

快速排序

#include 
#include 

void quickSort(int a[],int begin,int end){
    if(begin>=end) return;  //递归结束条件
    int i = begin,j = end,flag = a[i],tmp = 0;  //第一个为基准
    while(i!=j){
        while((i<j)&&(a[j]>flag)) j--; //从最后一个元素出发,每次循环j--,直到找到比flag小的数字,记录下标
        while((i<j)&&(a[i]<=flag)) i++;  //从开头元素出发,每次循环i++,直到找到比flag大的数字,记录下标
        if(j>i){  //交换
            tmp = a[i];
            a[i] = a[j];
            a[j] = tmp;
        }
    }
    a[begin] = a[i];
    a[i] = flag;  //交换基准数与i和j相遇的位置的数
    quickSort(a,begin,i-1);  //左子数组递归
    quickSort(a,i+1,end);   //右子数组递归
}

int main()
{
    int a[] = {12,32,61,5,9,63,89,2};
    for(int i=0;i<8;i++)
        printf("%d ",a[i]);
    quickSort(a,0,7);
    printf("\n");
    for(int i=0;i<8;i++)
        printf("%d ",a[i]);
    return 0;
}

希尔排序

#include 
#include 

void shellSort(int a[], int n){
	int i,j,gap;  // gap为步长,每次减为原来的一半
	for (gap = n / 2; gap > 0; gap /= 2){  // 共gap个数组,对每一组都执行直接插入排序
		for (i = 0; i < gap; i++) {
			for (j = i + gap; j < n; j += gap){  // 如果a[j]
				if (a[j] < a[j - gap]){
					int tmp = a[j];
					int k = j - gap;
					while (k >= 0 && a[k] > tmp){
						a[k + gap] = a[k];
						k -= gap;
					}
					a[k + gap] = tmp;
				}
			}
		}
	}
}

int main()
{
    int a[] = {12,32,61,5,9,63,89,2};
    for(int i=0;i<8;i++)
        printf("%d ",a[i]);
    shellSort(a,8);
    printf("\n");
    for(int i=0;i<8;i++)
        printf("%d ",a[i]);
    return 0;
}

归并排序

#include 
#include 

void Merge(int arr[], int tmp[], int start,int mid, int end){//合并小组并排序
	int i = start;  //i标识,左小组的第一个元素位置
	int j = mid + 1;//j标识,右小组的第一个元素位置
	int k = start;  //tmp当前小组存放的起始位置
	while (i < mid + 1 && j < end + 1){//左小组越界或右小组越界才能退出
		if (arr[i] <= arr[j])
			tmp[k++] = arr[i++];
		else
			tmp[k++] = arr[j++];
	}
	while (j < end + 1){  //如果右边小组没有越界
		tmp[k++] = arr[j++];
	}
	while (i < mid + 1){  //如果左边小组没有越界
		tmp[k++] = arr[i++];
	}
	for (i = start; i <= end; i++){
		arr[i] = tmp[i];
	}
}

void MergeS(int arr[], int tmp[], int start, int end){//划分小组,现在没有end
	if (start < end){
		int mid = (start+end)/2;
		MergeS(arr, tmp, start, mid);
		MergeS(arr, tmp, mid + 1, end);
		Merge(arr, tmp, start, mid, end);
	}
}

void mergeSort(int arr[], int len){
	int *tmp = (int *)malloc(sizeof(int)*len);//开了一个排序后结果保存的临时数组
	MergeS(arr, tmp, 0, len - 1);//嵌套调用
	free(tmp);
}

int main()
{
    int a[] = {12,32,61,5,9,63,89,2};
    for(int i=0;i<8;i++)
        printf("%d ",a[i]);
    mergeSort(a,8);
    printf("\n");
    for(int i=0;i<8;i++)
        printf("%d ",a[i]);
    return 0;
}

不同排序算法之间的比较:
【C/C++】排序算法代码实现_第1张图片

以上属个人见解。
❤️希望对您有帮助,您的支持是我创作最大的动力!

你可能感兴趣的:(C/C++,排序算法,c语言,算法)