热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

C语言的排序算法

冒泡排序冒泡排序(英语:BubbleSort)是一种简单的排序算法。它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序(如从大到小、首字母从A到Z)错误就把他们交换过来。



冒泡排序
冒泡排序(英语:Bubble Sort)是一种简单的排序算法。它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序(如从大到小、首字母从A到Z)错误就把他们交换过来。
选择排序
选择排序(Selection sort)是一种简单直观的排序算法。它的工作原理如下。首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置,然后,再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾。以此类推,直到所有元素均排序完毕。
插入排序
插入排序(英语:Insertion Sort)是一种简单直观的排序算法。它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。插入排序在实现上,通常采用in-place排序(即只需用到 {\displaystyle O(1)} {\displaystyle O(1)}的额外空间的排序),因而在从后向前扫描过程中,需要反复把已排序元素逐步向后挪位,为最新元素提供插入空间。
希尔排序
希尔排序,也称递减增量排序算法,是插入排序的一种更高效的改进版本。希尔排序是非稳定排序算法。希尔排序是基于插入排序的以下两点性质而提出改进方法的:


  • 插入排序在对几乎已经排好序的数据操作时,效率高,即可以达到线性排序的效率
  • 但插入排序一般来说是低效的,因为插入排序每次只能将数据移动一位

归并排序
把数据分为两段,从两段中逐个选最小的元素移入新数据段的末尾。
快速排序
在区间中随机挑选一个元素作基准,将小于基准的元素放在基准之前,大于基准的元素放在基准之后,再分别对小数区与大数区进行排序。
代码如下:

#include
//冒泡排序
void bubble_sort(int arr[],int len);
//选择排序
void selection_sort(int arr[],int len);
//插入排序
void insertion_sort(int arr[],int len);
//希尔排序
void shell_sort(int arr[], int len);
//归并排序
void merge_sort(int arr[], int len);
//快速排序
void quick_sort(int arr[], int len);
void main(){

int arr[10]={24,5,7,84,354,78,14,47,78,89};
// 获取数组长度
int len = (int) sizeof(arr) / sizeof(*arr);
// 调用排序算法
//bubble_sort(arr,len);冒泡排序
//selection_sort(arr,len); 选择排序
//insertion_sort(arr,len); 插入排序
//shell_sort(arr,len);//希尔排序
//merge_sort(arr,len); 归并排序
quick_sort(arr,len);
for(int i = 0;i printf("%d\t",arr[i]);
}
}
// 冒泡排序
void bubble_sort(int arr[],int len){

int i,j,temp;
for(i=0;i for(j=i;j if(arr[j]>arr[j+1]){ //进行比较替换
temp=arr[j];
arr[j]=arr[j+1];
arr[j+1]=temp;
}
}
}
}
// 选择排序
void selection_sort(int arr[],int len){
int i,j,temp;
for(i=0;i int min=i; // 记录最小值,第一个元素默认最小
for(j=1+i;j // 找到目前最小值
if(arr[min]>arr[j]){
min = j;
}

}
if(min!=i){
temp=arr[min];
arr[min] = arr[i];
arr[i] = temp;
}
}
}
// 插入排序
void insertion_sort(int arr[],int len){
int i,j,temp;
for(i=1;i temp=arr[i];
for(j=i;j>0 && arr[j-1]>temp;j--){ // 跟前一个数进行比较
arr[j] = arr[j-1];
}
arr[j]=temp;
}
}
//希尔排序
void shell_sort(int arr[], int len) {
int gap, i, j;
int temp;
for (gap = len >> 1; gap > 0; gap = gap >> 1)
for (i = gap; i temp = arr[i];
for (j = i - gap; j >= 0 && arr[j] > temp; j -= gap)
arr[j + gap] = arr[j];
arr[j + gap] = temp;
}
}
// 归并排序
void merge_sort_recursive(int arr[], int reg[], int start, int end) {
if (start >= end)
return;
int len = end - start, mid = (len >> 1) + start;
int start1 = start, end1 = mid;
int start2 = mid + 1, end2 = end;
merge_sort_recursive(arr, reg, start1, end1);
merge_sort_recursive(arr, reg, start2, end2);
int k = start;
while (start1 <= end1 && start2 <= end2)
reg[k++] = arr[start1] while (start1 <= end1)
reg[k++] = arr[start1++];
while (start2 <= end2)
reg[k++] = arr[start2++];
for (k = start; k <= end; k++)
arr[k] = reg[k];
}
void merge_sort(int arr[], int len) {
//int reg[len];
int reg[10];
merge_sort_recursive(arr, reg, 0, len - 1);
}
//快速排序
void swap(int *x, int *y) {
int t = *x;
*x = *y;
*y = t;
}
void quick_sort_recursive(int arr[], int start, int end) {
if (start >= end)
return;
int mid = arr[end];
int left = start, right = end - 1;
while (left while (arr[left] left++;
while (arr[right] >= mid && left right--;
swap(&arr[left], &arr[right]);
}
if (arr[left] >= arr[end])
swap(&arr[left], &arr[end]);
else
left++;
if (left)
quick_sort_recursive(arr, start, left - 1);
quick_sort_recursive(arr, left + 1, end);
}
void quick_sort(int arr[], int len) {
quick_sort_recursive(arr, 0, len - 1);
}


推荐阅读
author-avatar
涉世未深的phper
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有