使使用用C语语言言实实现现12种种排排序序方方法法
1.冒冒泡泡排排序序
思路:比较相邻的两个数字,如果前一个数字大,那么 交换两个数字,直到有序。
时间复杂度O(n^2),稳定性:这是一种稳定的算法。
代码实现:
void bubble_sort(int arr[],size_t len){
size_t i,j;
for(i=0;i
bool hasS ap = false; //优化,判断数组是否已经有序,如果有序可以提前退出循环
for(j=1;j
if(arr[j-1]>arr[j]){ //如果前一个比后一个大
s ap(&arr[j-1],&arr[j]); //交换两个数据
hasS ap = true;
}
}
if(!hasS ap){
break;
}
}
}
2.插插入入排排序序
思路:把一个数字插入一个有序的序列中,使之仍然保持有序,如对于需要我们进行排序的数组,我们可以使它的前i个数字有
序,然后再插入i+1个数字,插入到合适的位置使之仍然保持有序,直到所有的数字有序。
时间复杂度:O(n^2) 稳定性:稳定的算法
代码实现:
void insert_sort(int arr[],int len){
int i,j;
for(i=1;i
int key = arr[i]; //记录当前需要插入的数据
for(j= i-1;i>=0&&arr[j]>key;j--){ //找到插入的位置
arr[j+1] = arr[j]; //把需要插入的元素后面的元素往后移
}
arr[j+1] = key; //插入该元素
}
}
3.折折半半插插入入排排序序
思路:本质上是插入排序,但是通过半分查找法找到插入的位置,让效率稍微快一点。
时间复杂度:O(n^2),稳定性:稳定的算法。
代码实现:
void half_insert_sort(int arr[],int len){
int i,j;
for(i=1;i
int key = arr[i];
int left = 0;
int right = i-1;
hile(left<=right){ //半分查找找到插入的位置
int mid = (left+right)/2;
if(key
right = mid-1;
}else{
left = mid+1;
}
}
for(j=i-1;j>=left;j--){ //把后面的元素往后移
arr[j+1]=arr[j];
}
arr[j+1] = key; //插入元素
}
}
4.希希尔尔排排序序
思路:先取一个正整数d 1
排序操作;直至di=1,即所有记录放进一个组中排序为止。
时间复杂度:O(n^1.3) ,算法效率上大大提高 。稳定性:不稳定的算法。
代码实现:
void shell_sort(int arr[],int len){ //本质上也是一种插入排序,避免了大量数据的移动,在每一组
排序过后,每个数据已经到了大致的位置。
int i,j;
int step=0;
for(step = len/2;step>=1;step=step/2){ //分组 分为step组,对每组的元素进行插入排序