冒泡排序 分析:第 i 趟遍历可以将序列中的第 i 个最大值找到,放到倒数第 i 个位置; 从第一个位置开始,一趟遍历找最大值,需要每次与后一个相邻位置比较,将较大值后移;
template <typename T>voidBubbleSort(T a[], int len){
int i, j;T temp;for(j =0; j < len -1; j++)//共进行n-1趟排序,最后一个元素为最小的不需要再比较{for(i =0; i < len -1- j; i++)if(a[i]> a[i +1])//相邻元素进行比较,将较大的元素往后移{
temp = a[i];
a[i]= a[i +1];
a[i +1]= temp;}}}
插入排序 分析:将第 i 个数在前面已经排好序的 i-1 个数中找合适的位置插入; 将数后移而不是交换,省去辅助变量节约了时间;
template <typename T>voidInsertSort(T arr[], int len){if(arr ==NULL|| len <=0){return;}T value;for(int i =1; i < len; i++)//默认第一个数有序,则需要插入n-1个数{
value = arr[i];for(int j = i -1; j >=0; j--)//前i个数有序{if(value < arr[j]){
arr[j +1]= arr[j];//将比第i+1个数大的数往后移
arr[j]= value;}else{break;}}}}
选择排序 分析:第 1 趟选择第1小数,然后与第一个位置的数交换; …; 第 i 趟选择第i小数,然后与第 i 个位置的数交换;
template<typename T>voidSelectionSort(T arr[],int n){
int index;// 用来保存最小值得索引for(int i =0; i <10;++i){
index = i;//当前数作为最小数用于比较for(int j = i +1; j <10; j++)// 寻找第i个小的数值{if(arr[index]> arr[j]){
index = j;}}T value = arr[index];// 将找到的第i个小的数值放在第i个位置上
arr[index]= arr[i];
arr[i]= value;}}
voidshellSort(int a[], int n){
int add = n /2;while(add >=1){for(int i =0; i < add; i++)//一趟希尔排序相当于把增量个数列进行插入排序{for(int j = i + add; j < n; j=j+add)//j直接从第二个带插数列开始,避免插入比较时的index超范围现象{for(int k = j; k >= i; k = k - add)//k>=i是因为每趟希尔排序开始的初始位置是i{if(a[k]< a[k - add]){
int tmp = a[k];
a[k]= a[k - add];
a[k - add]= tmp;}else{break;}}}}
add = add /2;}}