自主编程实现选择,冒泡,快速,归并,希尔排序
2017-07-18 23:56
387 查看
(1)选择排序:选择排序(Selection sort)是一种简单直观的排序算法。它的工作原理是每一次从待排序的数据
元素中选出最小(或最大)的一个元素,存放在序列的起始位置,直到全部待排序的数据元素排完。
选择排序是不稳
定的排序方法(比如序列[5, 5, 3]第一次就将第一个[5]与[3]交换,导致第一个5挪动到第二个5后面)。
(2)冒泡排序:冒泡排序(Bubble Sort),是一种计算机科学领域的较简单的排序算法。它重复地走访过要排
序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。走访数列的工作是重复地进行直到没有再需
要交换,也就是说该数列已经排序完成。
(3)快速排序:快速排序(Quicksort)是对冒泡排序的一种改进。它的基本思想是:通过一趟排序将要排序的
数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数
据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。
(4)归并排序:归并排序(MERGE-SORT)是建立在归并操作上的一种有效的排序算法,该算法是采用分治法
(Divide and Conquer)的一个非常典型的应用。将已有序的子序列合并,得到完全有序的序列;即先使每个子序列
有序,再使子序列段间有序。若将两个有序表合并成一个有序表,称为二路归并。归并过程为:比较a[i]和b[j]的大
小,若a[i]≤b[j],则将第一个有序表中的元素a[i]复制到r[k]中,并令i和k分别加上1;否则将第二个有序表中的元素b[j]
复制到r[k]中,并令j和k分别加上1,如此循环下去,直到其中一个有序表取完,然后再将另一个有序表中剩余的元素
复制到r中从下标k到下标t的单元。归并排序的算法我们通常用递归实现,先把待排序区间[s,t]以中点二分,接着把左
边子区间排序,再把右边子区间排序,最后把左区间和右区间用一次归并操作合并成有序的区间[s,t]。
(5)希尔排序:希尔排序(Shell Sort)是插入排序的一种。希尔排序是把记录按下标的一定增量分组,对每组使用
直接插入排序算法排序;随着增量逐渐减少,每组包含的关键词越来越多,当增量减至1时,整个文件恰被分成一
组,算法便终止。点击这里为一篇详细介绍希尔排序的博文。
元素中选出最小(或最大)的一个元素,存放在序列的起始位置,直到全部待排序的数据元素排完。
选择排序是不稳
定的排序方法(比如序列[5, 5, 3]第一次就将第一个[5]与[3]交换,导致第一个5挪动到第二个5后面)。
#include <stdio.h> #define N 5 int main() { int a = {4,6,2,5,1}; int i , j ; int nTemp ; int nNum ; for(i=0 ;i<5 ; i++) { nTemp = i ; for(j=i+1;j<5;j++) { if(a[nTemp]>a[j]) { nTemp = j ; } } if(nTemp != i) { nNum = a[i] ; a[i] = a[nTemp] ; a[nTemp] = nNum ; } } for(i=0;i<N;i++) { printf("%d ",a[i]); } printf("\n"); return 0 ; }
(2)冒泡排序:冒泡排序(Bubble Sort),是一种计算机科学领域的较简单的排序算法。它重复地走访过要排
序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。走访数列的工作是重复地进行直到没有再需
要交换,也就是说该数列已经排序完成。
#include <stdio.h> #define N 5 int main() { char a = {4,6,2,5,1}; int i,j; int temp ; for(i=0;i<5;i++) { for(j=i+1;j<N;j++) { if(a[i]>a[j]) { temp = a[i] ; a[i] = a[j] ; a[j] = temp ; } } } for(i=0;i<N;i++) { printf("%d ",a[i]); } printf("\n"); return 0 ; }
(3)快速排序:快速排序(Quicksort)是对冒泡排序的一种改进。它的基本思想是:通过一趟排序将要排序的
数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数
据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。
#include <stdio.h> #define N 10 void Sort(int*a ,int left ,int right) { if(left > right) { return ; } int i = left ; int j = right ; int key = a[i] ; while(i<j) { while(i<j&&key<=a[j]) { j-- ; } a[i] = a[j]; while(i<j&&key>=a[i]) { i++ ; } a[j] = a[i] ; } a[i] = key ; Sort(a,left,i-1); Sort(a,i+1,right); } int main() { int i; int a ={2,4,6,8,1,3,5,7,9,0}; Sort(a,0,N-1); for(i=0;i<N;i++) { printf("%d ",a[i]); } printf("\n"); return 0 ; }
(4)归并排序:归并排序(MERGE-SORT)是建立在归并操作上的一种有效的排序算法,该算法是采用分治法
(Divide and Conquer)的一个非常典型的应用。将已有序的子序列合并,得到完全有序的序列;即先使每个子序列
有序,再使子序列段间有序。若将两个有序表合并成一个有序表,称为二路归并。归并过程为:比较a[i]和b[j]的大
小,若a[i]≤b[j],则将第一个有序表中的元素a[i]复制到r[k]中,并令i和k分别加上1;否则将第二个有序表中的元素b[j]
复制到r[k]中,并令j和k分别加上1,如此循环下去,直到其中一个有序表取完,然后再将另一个有序表中剩余的元素
复制到r中从下标k到下标t的单元。归并排序的算法我们通常用递归实现,先把待排序区间[s,t]以中点二分,接着把左
边子区间排序,再把右边子区间排序,最后把左区间和右区间用一次归并操作合并成有序的区间[s,t]。
#include <stdio.h> #define N 10 void Merge(int a[],int b[],int startIndex,int midIndex,int endIndex) { int i = startIndex ,j = midIndex+1 ,k = startIndex ; while(i != midIndex+1&&j != endIndex+1) { if(a[i]>a[j]) { b[k++] = a[j++] ; } else { b[k++] = a[i++] ; } } while(i != midIndex+1) { b[k++] = a[i++] ; } while(j != endIndex+1) { b[k++] = a[j++] ; } for(i=startIndex;i<=endIndex;i++) { a[i] = b[i] ; } } void Merge_sort(int a[],int b[],int startIndex,int endIndex) { int midIndex ; if(startIndex<endIndex) { midIndex = (startIndex+endIndex)/2 ; Merge_sort(a,b,startIndex,midIndex) ; Merge_sort(a,b,midIndex+1,endIndex) ; Merge(a,b,startIndex,midIndex,endIndex); } } int main() { int a ={2,4,6,8,1,5,3,9,0,7}; int b ; int i ; Merge_sort(a,b,0,N-1); for(i=0;i<N;i++) { printf("%d ",a[i]); } printf("\n"); return 0 ; }
(5)希尔排序:希尔排序(Shell Sort)是插入排序的一种。希尔排序是把记录按下标的一定增量分组,对每组使用
直接插入排序算法排序;随着增量逐渐减少,每组包含的关键词越来越多,当增量减至1时,整个文件恰被分成一
组,算法便终止。点击这里为一篇详细介绍希尔排序的博文。
#include <stdio.h> #include <math.h> #define N 10 void Shellsort(int a[],int n ,int t) //t为排序次数 { int m ; for(m = 1;m<=t;m++ ) { int i,j,temp ; int dk = pow(2,t-m+1)-1 ; //计算增量 for(i=dk;i<n;i++) { temp = a[i]; for(j=i-dk;(j>=i%dk)&&a[j]>temp;j-=dk) //比较与记录后移同时进行 { a[j+dk]= a[j] ; } if(j!=i-dk) { a[j+dk] = temp ; // 插入 } } } } int main() { int a = {2,4,6,8,0,1,3,5,7,9}; int i ; Shellsort(a,N,(int)(log(N+1)/log(2))); //排序次数应为log(N+1)/log2的整数 for(i=0;i<N;i++) { printf("%d ",a[i]); } printf("\n"); return 0 ; }
相关文章推荐
- 常用排序算法的c++实现(冒泡,选择,插入,堆,shell,快速,归并 )与sort()对比
- java实现七大排序(插入,冒泡,选择,快速,堆,希尔,归并)
- 排序算法总结与C++实现(冒泡、简单选择、直接插入、堆、归并、快速)
- 6种排序算法的简洁实现:冒泡、选择、插入、归并、快速、堆
- 编程实现直接插入排序、希尔排序、冒泡排序、快速排序、选择排序
- 6种排序算法的简洁实现:冒泡、选择、插入、归并、快速、堆
- Java语言实现九大排序算法(快速、归并、堆、选择、插入、计数、基数、希尔、冒泡)
- 常用排序算法的c++实现(冒泡,选择,插入,堆,shell,快速,归并 )与sort()对比
- c++实现数据结构中的各种排序方法:直接插入、选择,归并、冒泡、快速、堆排序、shell排序
- 6种排序算法的简洁实现:冒泡、选择、插入、归并、快速、堆
- Java-十种内部排序实现(选择,冒泡,插入,希尔,堆,归并,快速,基数,计数,桶)及代码下载
- 《冒泡,选择,插入,归并,希尔,快速》排序算法java实现一览
- 插入,归并,快速,冒泡,shell,选择排序 用c实现
- 常见内部排序算法 简单数组实现与分析(快速(偶原创partition函数,望众高手指正)、归并、希尔、插入、选择、冒泡)
- 常用排序算法的c++实现(冒泡,选择,插入,堆,shell,快速,归并 )与sort()对比 - coder_xia的专栏 - 博客频道 - CSDN.NET
- 6种排序算法的简洁实现:冒泡、选择、插入、归并、快速、堆
- 常见排序算法(冒泡、选择、插入、快速、归并C++实现)
- 九大排序算法及其实现- 插入.冒泡.选择.归并.快速.堆排序.计数.基数.桶排序.堆排序
- 编程:冒泡,选择,归并,快速
- 我的编程学习日志(8)--排序(冒泡,选择,快速以及sort函数)