神器网站:小菜学算法
冒泡排序
int sort_bubble(struct Array *array)
{
int i;
int j;
int tmp;
if(array->length < 2)
return ERROR; //当只有一个元素是不需要排序的;
for(i=0; i<array->length-1; i++) //我们下标就从0开始,只需要lengh-1趟
for(j=i+1; j<array->length; j++) // 和i后的每个元素比较
{
if(array->arr[i] > array->arr[j])
{
tmp = array->arr[i];
array->arr[i] = array->arr[j];
array->arr[j] = tmp;
}
}
return OK;
}
快速排序
int findPos(int* a, int low, int high)
{
int val = a[low];
while (low < high)
{
while ((low < high) && (a[high] > val))
high--;
a[low] = a[high];
while ((low < high) && (a[low] <= val))
low++;
a[high] = a[low];
}
a[low] = val;
return low;
}
void quickSort(int* a, int low, int high)
{
int pos;
if (low < high)
{
pos = findPos(a, low, high);
quickSort(a, low, pos-1);
quickSort(a, pos+1, high);
}
}
选择排序
int selectSort(struct Array* array)
{
int min;
int i, j;
if (len < 2)
return;
for (int i = 0; i < len-1; i++)
{
min = i;
for (j = i + 1; j < len; j++)
{
if (a[j] < a[min])
min = j;
}
if (min != i)
swap(&a[min], &a[i]);
}
}
插入排序
void insertSort(int* a, int len)
{
if (len < 2)
return;
for (int i = 1; i < len; i++)
{
int val = a[i];
int j = i - 1;
while ((j >= 0) && (a[j] > val))
{
a[j + 1] = a[j]; // 大值往后移位
j--;
}
a[j + 1] = val;
}
}
其他实现
#include <stdio.h>
int main(){
/* 插入排序*/
int a[7] = {6,1,7,5,4,9,3};
int cur;
int i, j;
int length = sizeof(a)/sizeof(a[0]);
for (i = 1; i < length; i++)
{
val = a[i]; //待排序元素
for (j = i - 1; j >= 0 && a[j] > val; j--)
{
a[j + 1] = a[j];
}
a[j + 1] = val;
}
for (int k = 0; k < length; ++k) {
printf("%d",a[k]);
printf(" ");
}
}
希尔排序
int shell_sort(struct Array *array)
{
int i,j,increment;
increment = array->length;
do{
increment = increment/3 + 1;
for(i=increment+1 ; i<array->length; i++)
{
if(array->arr[i] < array->arr[i-increment])
{
array->arr[0] = array->arr[i];
for(j=i-increment; j>0 && array->arr[j] > array->arr[0]; j-=increment)
{
array->arr[j+increment] = array->arr[j]; //发现后面有更小的,前移
}
array->arr[j+increment] = array->arr[0]; //把i位置的值付给后面前移之后空下来的位置
}
}
}while(increment>1);
return OK;
}
堆排序
void heap_adjust(struct Array *array, int s, int m)
{
int temp, j;
temp = array->arr[s];
for(j=2*s; j<=m; j*=2)
{
if(j<m && array->arr[j] < array->arr[j+1])
++j;
if(temp >= array->arr[j])
break;
array->arr[s] = array->arr[j];
s = j;
}
array->arr[s] = temp;
}
void heap_sort(struct Array *array)
{
int i;
for(i=array->length/2; i>0;i--)
heap_adjust(array, i, array->length);
for(i=array->length; i>1; i--)
{
swap(array, 1, i);
heap_adjust(array, 1, i-1);
}
测试
int traserse_array(struct Array *array)
{
int i;
if(array->length == 0)
return ERROR;
for(i=1; i<=array->length; i++)
printf("%d ", array->arr[i]);
printf("\n");
return OK;
}
void swap(struct Array *array, int i, int j)
{
int temp = array->arr[i];
array->arr[i] = array->arr[j];
array->arr[j] = temp;
}
int main()
{
int init_Arr[]={0,8,1,4,2,5,3,7,6,-1}; // 0是哨兵,不作为实际元素;-1是结束标志位,
struct Array array;
int mode=0;
init_array(&array, init_Arr);
printf("array length: %d \n", array.length);
traserse_array(&array);
mode = 1; //选择排序模式
switch(mode)
{
case 1: {sort1_bubble(&array);break;}
case 2: {sort2_bubble(&array);break;}
case 3: {sort3_bubble(&array);break;}
case 4: {select1_sort(&array);break;}
case 5: {insert_sort1(&array);break;}
case 6: {shell_sort(&array);break;}
case 7: {heap_sort(&array);break;}
default: break;
}
traserse_array(&array);
return 0;
}