这里,汇总了常见的排序算法具体代码实现。使用C语言编写。
排序算法实现
- 插入排序
- 冒泡排序
- 选择排序
- 快速排序
- 希尔排序
- 归并排序
插入排序
#include <stdio.h>
#include <stdlib.h>
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 <stdio.h>
#include <stdlib.h>
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 <stdio.h>
#include <stdlib.h>
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 <stdio.h>
#include <stdlib.h>
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 <stdio.h>
#include <stdlib.h>
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]<a[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 <stdio.h>
#include <stdlib.h>
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;
}
不同排序算法之间的比较:
以上属个人见解。
❤️希望对您有帮助,您的支持是我创作最大的动力!