插入排序的工作机理和打牌时,整理手中的排做法差不多。在开始摸牌的是,我们的左手是空的,排名朝下放在桌上,接着,一次从桌上摸一张牌,并将它插入左手排的正确位置上。为了找到这张牌的正确位置,要将他和手中的没一张哦从右到左进行比较,无论什么时候,左手中的牌都是排好序的。(出自:算法导论)
例如:5,4,6,2,7,3,4,1
5—>4,5—>4,5,6—>2,4,5,6—>2,4,5,6,7—->2,3,4,5,6,7—->2,3,4,4,5,6,7—->1,2,3,4,4,5,6,7
插入排序(InsertSort):
int InsertSort(int *a,int n){
//对长度为n的数组,进行插入排序,下标0~n-1
int i,j,key;
for(j=1;j<n;j++){
key=a[j];
i=j-1;
while(i>=0&&a[i]>key){//从右到左比较,当前元素大于关键值,当前元素后移
a[i+1]=a[i];
i--;
}
//i==-1(所有元素后移)||a[i]<=key,key插入到i+1位置
a[i+1]=key;
}
return 0;
}
冒泡排序:从n开始到下标1每次交换反序的两个相邻元素
这里只给出第一趟交换:
5,4,6,2,7,3,4,1—->5,4,6,2,7,3,1,4—>5,4,6,2,7,1,3,4—>5,4,6,2,1,7,3,4—>5,4,6,1,2,7,3,4—>5,4,1,6,2,7,3,4—>5,1,4,6,2,7,3,4—>1,5,4,6,2,7,3,4
冒泡排序(BubbleSort):
/**
*调用函数的方式BubbleSort(A,n):排序数组A[1..n];
*这里给出的都是递增排序
*/
int BubbleSort(int *A,int n){
for(int i=1;i<=n;i++){
for(int j=n;j>=1;j--){//这里必须从n--1,想想是为什么?
if(A[j]<A[j-1]) swap(A[j-1],A[j]);
}
}
return 0;
}
选择排序:每次选出剩余数中最小的数放在适当的位置,这里指的是升序排序,对每一个A[i],比较i+1—>n的所有元素,将小于A[i]的与A[i]交换位置。
这里只给出第一趟选择:
5,4,6,2,7,3,4,1—->4,5,6,2,7,3,4,1—->4,5,6,2,7,3,4,1—->2,5,6,4,7,3,4,1—->2,5,6,4,7,3,4,1—>2,5,6,4,7,3,4,1—->2,5,6,4,7,3,4,1—->2,5,6,4,7,3,4,1—>1,5,6,4,7,3,4,2
选择排序(SelectionSort):
/**
*调用函数的方式SelectionSort(A,n):排序数组A[1..n];
*这里给出的都是递增排序
*/
int SelectionSort(int *A,int n){
for(int i=1;i<=n;i++){
for(int j=i+1;j<=n;j++){
if(A[j]<A[i]) swap(A[j],A[i]);
}
}
return 0;
}
原文地址:http://blog.csdn.net/fool_ran/article/details/44303609