排序算法原理简述及C语言实现
来源:互联网 发布:全国多少个省市 知乎 编辑:程序博客网 时间:2024/05/17 16:46
=============================== 博客点滴积累,部分话语和知识点来源于网络,感谢网络资源的提供者======
1 冒泡排序
原理简述:冒泡排序,大泡泡在底下,小泡泡在上面,假设递增排序,即小数在前面,大数在后面。每一次比较相邻的两个数,第一个数大于第二个数,就交换顺序,一次比较到数组结尾,最后一个就是最大的数,再一次从头开始比较,比较到倒数第二个数,最后一个数不参与比较,以此一直比较,到没有数据交换为止,此时排序完成。
void bubblesort(int arr[],int len){ int i,j; int tmp; for(i = 0; i < len; i ++) { for(j = 1; j < len -i; j++) { if(arr[j-1] > arr[j]) { tmp = arr[j]; arr[j] = arr[j-1]; arr[j-1] = tmp; } } }}
2 插入排序
原理简述:插入排序,插入,即向有序的序列先比较再插入,首先假设数组首元素有序,取出第二个元素,与第一个比较,比第一个元素大,就交换顺序,接着取第三个元素,先与第二个元素,比第二个大,位置不动,比第二个小,第二个元素换到第三个元素的位置,再和第一个比较,比第第一个大,就放到第二个元素位置,比第一个元素小,就将一个元素,放到第二个元素的位置,以此类推。
void insertsort(int arr[],int len){ int i,k; int tmp; for(i = 1;i < len;i++) { tmp = arr[i]; k = i-1; while((k >=0) && (arr[k] > tmp)) { arr[k+1] = arr[k]; k--; } arr[k+1] = tmp; }}
3 选择排序
原理简述:选择排序,即在无序的数组中找个最小的放在第一位,接下来,在剩余的数中,再找一个最小的数,放到第二位,以此类推。
void selectsort(int arr[],int len){ int min; int i,j; int tmp; for(i = 0;i < len;i++) { min = arr[i]; for(j = i+1; j < len;j++) { if(min > arr[j]) { tmp = min; min = arr[j]; arr[j] = tmp; } } arr[i] = min; }}
4 希尔排序
原理简述:希尔排序,实质是分组插入排序,一般情况,假设数据8个元素,先分为(step = n/2)四组,(1,5),(2,6),(3,7),(4,8),组内先比较 ,比较交换后,再分为(step =step /2)两组,(1,3,5,7),(2,4,6,8),组内先比较排序交换,再分为(step =step /2)一组,排序后,就完成排序了,此时step =step/2 = 0。
void shellsort(int arr[],int len){ int step; int i,k; int tmp; for(step = len/2; step > 0; step = step/2) { for(i = step; i < len;i++) { if(arr[i - step] > arr[i]) { k = i -step; tmp = arr[i]; while(k>=0 && arr[k] > tmp) { arr[k+step] = arr[k]; k = k -step; } arr[k+step] = tmp; } } }}
5 快速排序
原理简述:快速排序,先选择一个元素(一般首元素或尾元素),假设是首元素,首先取出首元素缓存,首元素位置为空,定义两个变量low,high,low从最小下标递增,high最大下标递减,第一步,看high下标的这个元素,是否大于首元素缓存,大于则high–,继续判断直到不大于则将这个元素放到首元素的位置,此时,high下标的位置为空,比较low下标元素,小于缓存则low++,,继续判断直到不小于则将这个元素放到high下标元素的位置,此时,low下标的位置为空,以此循环,直到low不小于high为止,此时low位置放首元素的缓存,low位置最终就是这个元素排序的位置,然后以low位置为分界线分为两组,再做如上步骤。
void quicksort(int arr[],int left ,int right){ int low,high; int key; key = arr[left]; low = left; high = right; if(left < right) { while(low < high) { while((low < high) && (key <= arr[high])) { high--; } arr[low] =arr[high]; while((low < high) && (key > arr[low])) { low++; } arr[high] = arr[low]; } arr[low] = key; quicksort(arr,left,low-1); quicksort(arr,low+1,right ); }}
6 归并排序
原理简述:归并排序,先递归后合并,一组数分为两组,两组分为四组,四组分为八组,直到每组只有一个元素,此时认为有序,然后逆向合并,两个一个元素合并两个,两个合并四个,直到合并为一个大数组为止。以下代码来自百度百科。
void Merge(int sourceArr[],int tempArr[],int startIndex,int midIndex,int endIndex){ int i = startIndex,j=midIndex+1,k = startIndex; while(i!=midIndex+1 && j!=endIndex+1) { if(sourceArr[i]>sourceArr[j]) tempArr[k++] = sourceArr[i++]; else tempArr[k++] = sourceArr[j++]; } while(i!=midIndex+1) tempArr[k++] = sourceArr[i++]; while(j!=endIndex+1) tempArr[k++] = sourceArr[j++]; for(i=startIndex;i<=endIndex;i++) sourceArr[i] = tempArr[i];}void MergeSort(int sourceArr[],int tempArr[],int startIndex,int endIndex){ int midIndex; if(startIndex<endIndex) { midIndex=(startIndex+endIndex)/2; MergeSort(sourceArr,tempArr,startIndex,midIndex); MergeSort(sourceArr,tempArr,midIndex+1,endIndex); Merge(sourceArr,tempArr,startIndex,midIndex,endIndex); }}
堆排序比较麻烦一点,需要理解的知识点较多,下次博客再详细写吧。
- 排序算法原理简述及C语言实现
- 堆排序原理简述及C实现实例
- 堆排序原理及c语言实现
- CRC算法原理及C语言实现
- CRC算法原理及C语言实现
- CRC算法原理及C语言实现
- Shell排序算法及C语言实现
- 堆排序算法及C语言实现
- 快速排序算法 原理及golang语言实现
- 最全各类排序算法原理及其C语言实现
- CRC算法原理及C语言实现(一)
- CRC算法原理及C语言实现(转)
- cannon算法的原理及MPI C语言实现
- 常见排序算法总结及C语言实现
- 双向冒泡排序算法思想及C语言实现
- 快速排序算法思想及C语言实现
- 选择排序算法思想及C语言实现
- 常见的排序算法对比及实现C语言版本
- C#实现三维数字地形漫游
- 字符串S2 是不是S1的反转(算法)
- 使用Maven管理Android项目
- iOS 键盘自适应(IQKeyboardManager)使用小结
- Linux下调试shell的几种方法
- 排序算法原理简述及C语言实现
- Qt所有类型转换
- [OpenCV]拓展图像边界
- Android编写Service入门
- Database Schema Reader
- (母函数变形)hdu 2082 找单词
- Nginx+Tomcat配置多个二级域名
- android-基础篇-常用控件
- Android Lib Project与Android Project中R文件的区别