第一次写博客,如果有错误,欢迎大家指出,谢谢。
1、选择排序:假设数组的长度为N。
Step1:首先在0~N-1的位置上找最小的元素,将最小的元素与0位置的元素交换。
Step2:然后在1~N-1的位置上找最小的元素,将最小的元素与1位置的元素交换。
......
StepN:区间变为1个元素,结束。
选择排序的实质就是,不停的遍历,依次将最小的元素放在区间开头,然后不停的向后缩小区间。
2、冒泡排序:假设数组的长度为N。
Step1:从前往后两两比较,将大值放在右边,这样遍历一次就可以把全局最大值放在区间最右边。
Step2:将区间缩短一个单位,继续从前往后比较,这一次是区间0~N-2。
......
StepN:遍历N次,区间缩短成1个单位,结束。
3、插入排序
插入排序和扑克牌理牌类似,每次认为指针左边的数列是有序数列,设置哨兵保存当前指针指向的数据,依次拿哨兵和左边的有序数列比较,如果哨兵>递减值,那么左边数列依次右移,直到哨兵>=递减值火车递减完成,就将哨兵的值插入递减指针指向的后一位。
程序贴在下方,经验证,排序成功。
#include<iostream> using namespace std; #define N 12 void BubbleSort(int *a,int length) { for(int i=length-1;i>=0;i--) { for(int j=0;j+1<=i;j++) { if(a[j]>a[j+1]) { int swap = a[j]; a[j] = a[j+1]; a[j+1] = swap; } } } } void ChooseSort(int *a,int length) { for(int i=0;i<length;i++) { int idx=0; int flag=0; int min=a[i]; for(int j=i;j<length;j++) { if(a[j] < min) { idx = j; min = a[j]; flag =1; } } if(flag ==1) { int swap = a[idx]; a[idx] = a[i]; a[i] = swap; } } } void InsertSort(int *a, int length) { for(int i=1;i<length;i++) { int tmp = a[i]; int j=0; for(j=i-1;j>=0 && tmp < a[j];j--) { a[j+1] = a[j]; } a[j+1] = tmp; } } void ArrayCopy(int *a, int *b, int length) { for(int i=0;i<length;i++) { b[i] = a[i]; } } void printArray(int *a, int length) { for(int i=0;i<length;i++) { cout<<a[i]<<" "; } cout<<endl; } int main() { int input[N]={5,4,3,2,1,7,9,8,0,11,15,21}; int cinput[N]={0},cinput2[N]={0}; ArrayCopy(input,cinput,N); ArrayCopy(input,cinput2,N); BubbleSort(input,N); ChooseSort(cinput,N); InsertSort(cinput2,N); printArray(input,N); printArray(cinput,N); printArray(cinput2,N); return 0; }