(选择、冒泡、插入、快速)排序
2012-01-05 14:39
211 查看
选择排序是一种简单直观的排序算法。它的工作原理如下。首先在未排序序列中找到最小元素,存放到排序序列的起始位置,然后,再从剩余未排序元素中继续寻找最小元素,然后放到排序序列末尾。以此类推,直到所有元素均排序完毕。
选择排序choose_sort.c
冒泡排序算法的运作如下:
比较相邻的元素。如果第一个比第二个大,就交换他们两个。
对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。在这一点,最后的元素应该会是最大的数。
针对所有的元素重复以上的步骤,除了最后一个。
持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。
冒泡排序bubble.c
插入排序:将一个数插入到排好序的数列中,从而得到一个新的有序表。
一般来说,插入排序都采用in-place在数组上实现。具体算法描述如下:
1 从第一个元素开始,该元素可以认为已经被排序
2 取出下一个元素,在已经排序的元素序列中从后向前扫描
3 如果该元素(已排序)大于新元素,将该元素移到下一位置
4 重复步骤3,直到找到已排序的元素小于或者等于新元素的位置
5 将新元素插入到该位置中
6 重复步骤2~5
插入排序insert.c
快速排序使用分治法策略来把一个序列分为两个子序列。
步骤为:
从数列中挑出一个元素,称为 "基准"(pivot),
重新排序数列,所有元素比基准值小的摆放在基准前面,所有元素比基准值大的摆在基准的后面(相同的数可以到任一边)。在这个分割结束之后,该基准就处于数列的中间位置。这个称为分割操作。
递归地把小于基准值元素的子数列和大于基准值元素的子数列排序。
快速排序qsort.c
选择排序choose_sort.c
#include <stdio.h> void choose_sort(int [],int); int main() { int i,len; int array[] = {3,4,2,1}; len = sizeof(array) / sizeof(int); //元素个数 printf("原始输出:"); for(i = 0; i < len; i++) printf("%d\t",array[i]); printf("\n"); choose_sort(array,len); printf("选择排序:"); for (i = 0; i < len; i++) printf("%d\t",array[i]); printf("\n"); return 0; } void choose_sort(int x[], int size)/*x数组名size为数组长度*/ { int i, j, min, k; for(i = 0; i < size-1; i++){ min = i; for(j = i+1; j < size; j++){ if(x[min] > x[j]) min = j; } if(min != i){ k = x[i]; x[i] = x[min]; x[min] = k; } } }
冒泡排序算法的运作如下:
比较相邻的元素。如果第一个比第二个大,就交换他们两个。
对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。在这一点,最后的元素应该会是最大的数。
针对所有的元素重复以上的步骤,除了最后一个。
持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。
冒泡排序bubble.c
#include <stdio.h> void bubble(int[] , int); int main() { int i,array[] = {3,4,2,1}; int len = sizeof(array)/sizeof(int); printf("原始的输出:"); for(i = 0; i < len; i++) printf("%d\t",array[i]); //原始输出 printf("\n"); bubble(array,len); return 0; } void bubble(int s[],int size) { int i,j,temp; for(i = 1; i < size; i++) //i不参与数组下标,仅表示比较size-1轮 for(j = 0; j < size-i; j++) if (s[j] > s[j+1]) { temp = s[j]; s[j] = s[j+1]; s[j+1] = temp; } printf("冒泡后输出:"); for (i = 0; i < size; i++) printf("%d\t",s[i]); printf("\n"); }
插入排序:将一个数插入到排好序的数列中,从而得到一个新的有序表。
一般来说,插入排序都采用in-place在数组上实现。具体算法描述如下:
1 从第一个元素开始,该元素可以认为已经被排序
2 取出下一个元素,在已经排序的元素序列中从后向前扫描
3 如果该元素(已排序)大于新元素,将该元素移到下一位置
4 重复步骤3,直到找到已排序的元素小于或者等于新元素的位置
5 将新元素插入到该位置中
6 重复步骤2~5
插入排序insert.c
#include <stdio.h> void isort(int [],int); int main() { int i,len; int array[] = {3,4,2,1}; len = sizeof(array) / sizeof(int); //元素个数 printf("原始输出:"); for(i = 0; i < len; i++) printf("%d\t",array[i]); printf("\n"); isort(array,len); return 0; } void isort(int a[],int size) { int i,j,temp; for(i = 1; i < size; i++) //遍历数组 { temp = a[i]; for(j = i-1; j >= 0 && a[j] > temp; j--) //元素后移 a[j+1] = a[j]; a[j+1] = temp; //插入 } printf("插入排序:"); for(i = 0; i < size; i++) printf("%d\t",a[i]); printf("\n"); }
快速排序使用分治法策略来把一个序列分为两个子序列。
步骤为:
从数列中挑出一个元素,称为 "基准"(pivot),
重新排序数列,所有元素比基准值小的摆放在基准前面,所有元素比基准值大的摆在基准的后面(相同的数可以到任一边)。在这个分割结束之后,该基准就处于数列的中间位置。这个称为分割操作。
递归地把小于基准值元素的子数列和大于基准值元素的子数列排序。
快速排序qsort.c
#include<stdio.h> void qsort(int v[],int left,int right); int main() { int i,array[] = {4,3,2,1}; int len = sizeof(array) / sizeof(int); printf("原始的输出:"); for(i = 0; i < len; i++) printf("%d\t",array[i]); //原始输出 printf("\n"); qsort(array,0,len-1); printf("快速排列后:"); for(i = 0; i < len; i++) printf("%d\t",array[i]); printf("\n"); return 0; } void qsort(int v[],int left,int right) //快速排序法 { int i,last; void swap(int v[],int i,int j);//声明swap函数(交换v[i]与v[j]的值) if(left >= right) //若包含数组少于2个 return; //则不执行任何操作 swap(v,left,(left+right)/2); last = left; //移动到v[0] for(i = left+1; i <= right; i++) //划分子集 if (v[i] < v[left]) swap(v,++last,i); swap(v,left,last);//恢复划分子集的元素 qsort(v,left,last-1); qsort(v,last+1,right); } void swap(int v[],int i,int j) { int temp; temp = v[i]; v[i] = v[j]; v[j] = temp; }
相关文章推荐
- 六种排序方法的学习(直接插入、希尔、冒泡、快速、选择、归并)
- 从零开始_学_数据结构(六)——排序(冒泡、插入、希尔、简单选择、归并、快速)
- 常用的排序 冒泡 ,选择,插入,快速
- 排序算法复习(Java实现): 插入,冒泡,选择,Shell,快速排序
- 排序总结(冒泡、选择、插入、快速)
- 数据结构排序算法总结包括选择、插入、希尔、快速、冒泡等排序方法
- 插入排序 冒泡 选择 快速
- 排序算法复习(Java实现)(一): 插入,冒泡,选择,Shell,快速排序
- C语言实现 排序源程序(包括直接插入、希尔、冒泡、快速、简单选择、堆排序)
- 排序(冒泡、选择、插入、快速)
- 排序算法复习(Java实现)(一): 插入,冒泡,选择,Shell,快速排序
- 简单选择,冒泡,插入,快速排序之效率比较
- java实现冒泡,选择,插入,快速排序
- 数组排序(插入、选择、希尔、堆、归并、快速、冒泡)
- java实现七大排序(插入,冒泡,选择,快速,堆,希尔,归并)
- 插入,冒泡,选择,快速排序,二分查找
- java排序之冒泡、插入、选择、快速等排序算法
- c# 自定义排序类(冒泡、选择、插入、希尔、快速、归并、堆排序等)
- C语言排序(冒泡,选择,插入,归并,快速)
- 九大排序算法及其实现- 插入.冒泡.选择.归并.快速.堆排序.计数.基数.桶排序.堆排序