1、插入排序
主要思想:从第一个元素开始往后走,只不过每次比较从后往前比较。
具体实现:记录走到的元素的值,给前面排好序的元素比较,遇见大的向后搬移,直到遇见小的,将该值放在小值的后面
void InsertSort(int array[], int size)
{
for (int i = 0; i < size; i++){
int last = array[i];
int j;
for (j = i - 1; j >= 0; j--){
if (array[j] < last){
break;
}
array[j + 1] = array[j];
}
array[j + 1] = last;
}
}
2、希尔排序
主要思想:将元素按gap = (gap / 3) + 1(gap = size)的分配规则,分成gap份,每次将隔gap大小的元素进行比较排序
具体实现:在直接插入排序的基础上,只不过每次给和gap相等数的元素个数,直到gap等于1
void InsertSortWithGap(int *array, int size, int gap)
{
for(int i = gap; i < size; i++){
int last = array[i];
int j;
for(j = i - gap; j >= 0; j -= gap){
if(array[j] < last){
break;
}
array[j + gap] = array[j];
}
array[j + gap] = last;
}
}
void ShellSort(int *array, int size)
{
int gap = size;
while(gap != 1){
gap = (gap / 3) + 1;
InsertSortWithGap(array, size ,gap);
}
}
3、冒泡排序
主要思想:size个数只需要比较size-1次,每次将大的数向后移
具体实现:两两相比,将最大的数往后移,循环一次,移动次数减一(因为后面的数已经是大数)
void BubbleSort(int *array, int size)
{
for(int i = 1; i < size; i++){
int count = 0;
for(int j = 0; j < size - i; j++){
if(array[j] > array[j + 1]){
int tmp = array[j];
array[j] = array[j + 1];
array[j + 1] = tmp;
count++;
}
}
if(count == 0){
break;
}
}
}