一、插入排序
#include <stdio.h>
#include <stdlib.h>
void insertsort(int *array, int len)
{
int i, j, temp;
for(i = 1; i < len; i++)
{
temp = array[i];
j = i;
while(temp < array[j - 1])
{
array[j] = array[j - 1];
j--;
}
array[j] = temp;
}
}
int main()
{
int array[10] = {1 ,3 ,5, 7, 9, 2, 4, 6, 8, 10};
int i;
printf("array[i]前 =");
for(i = 0; i < 10; i++)
{
printf("%d ", array[i]);
}
printf("\n");
insertsort(array, 10);
printf("array[i]后 =");
for(i = 0; i < 10; i++)
{
printf("%d ", array[i]);
}
return 0;
}
二、希尔排序
#include <stdio.h>
#include <stdlib.h>
void shellsort(int *array, int len)
{
int i, j, gap, temp;
gap = len / 2;
while(gap > 0)
{
for(i = gap + 1; i <= len; i++)
{
j = i - gap;
while(j > 0)
{
if(array[j] > array[j + gap])
{
temp = array[j];
array[j] = array[j + gap];
array[j + gap] = temp;
j = j - gap;
}
else
{
j = 0;
}
}
}
gap = gap / 2;
}
}
int main()
{
int array[10] = {1 ,3 ,5, 7, 9, 2, 4, 6, 8, 10};
int i;
printf("array[i]前 =");
for(i = 0; i < 10; i++)
{
printf("%d ", array[i]);
}
printf("\n");
shellsort(array, 10);
printf("array[i]后 =");
for(i = 0; i < 10; i++)
{
printf("%d ", array[i]);
}
return 0;
}
三、冒泡排序
#include <stdio.h>
#include <stdlib.h>
void bubblesort(int *array, int len)
{
int i, j, temp;
for(i = 0; i < len - 1; i++)
{
for(j = 0; j < len - 1; j++)
{
if(array[j] > array[j + 1]))//一趟冒泡排序能使一个值入最终位置,该题是每次最大那个入最终位置
{
temp = array[j];
array[j] = array[j + 1];
array[j + 1] = temp;
}
}
}
}
int main()
{
int array[10] = {1 ,3 ,5, 7, 9, 2, 4, 6, 8, 10};
int i;
printf("array[i]前 =");
for(i = 0; i < 10; i++)
{
printf("%d ", array[i]);
}
printf("\n");
bubblesort(array, 10);
printf("array[i]后 =");
for(i = 0; i < 10; i++)
{
printf("%d ", array[i]);
}
return 0;
}
四、快速排序
#include <stdio.h>
#include <stdlib.h>
void quicksort(int data[],int s,int t)
{
int i, j, temp;
temp = data[s]; //还是以第一个元素为主元。
i = s;
j = t;
if(s > t)
{
return;
}
while(i != j)
{
while(i < j && data[j] >= temp)
{
j--;
}
if(i < j)
{
data[i++] = data[j];
}
while(i < j && data[i] <= temp)
{
i++;
}
if(i < j)
{
data[j--]=data[i];
}
}
data[i] = temp; //temp。同上,返回的是枢纽元素,即主元元素。
quicksort(data, s, i - 1); //递归左边
quicksort(data, i + 1, t); //递归右边
}
int main()
{
int array[10] = {1 ,3 ,5, 7, 9, 2, 4, 6, 8, 10};
int i;
printf("array[i]前 =");
for(i = 0; i < 10; i++)
{
printf("%d ", array[i]);
}
printf("\n");
quicksort(array, 1, 10);
printf("array[i]后 =");
for(i = 0; i < 10; i++)
{
printf("%d ", array[i]);
}
return 0;
}
五 、选择排序
#include <stdio.h>
#include <stdlib.h>
void selectsort(int data[], int len)
{
int i, j, k, temp;
for(i = 0; i < len - 1; i++)
{
k = i;
for(j = i + 1; j < len; j++)
{
if(data[j] < data[k])
{
k = j;
}
}
temp = data[k];
data[k] = data[i];
data[i] = temp;
}
}
int main()
{
int array[10] = {1 ,3 ,5, 7, 9, 2, 4, 6, 8, 10};
int i;
printf("array[i]前 =");
for(i = 0; i < 10; i++)
{
printf("%d ", array[i]);
}
printf("\n");
selectsort(array, 10);
printf("array[i]后 =");
for(i = 0; i < 10; i++)
{
printf("%d ", array[i]);
}
return 0;
}
六、堆排序
#include <stdio.h>
#include <stdlib.h>
void adjust(int, int);
int data[11] = {0, 75, 23, 98, 44, 57, 12, 29, 64, 38, 82};
int main()
{
int i, k, temp;
printf("Heap sort:\n");
printf("Number:");
for(k = 1; k <= 10; k++)
{
printf("%d ", data[k]);
}
printf("\n");
for(i = 10 / 2; i > 0; i--)
{
adjust(i, 10);
}
printf("\n Heap: ");
for(k = 1; k <= 10; k++)
{
printf("%d ", data[k]);
}
for(i = 9; i > 0; i--)
{
temp = data[i + 1];
data[i + 1] = data[1];
data[1] = temp; // 将树根和最后的节点交换
adjust(1, i); // 再重新调整为堆树
printf("\nAccess");
for(k = 1; k <= 10; k++)
{
printf("%d ", data[k]);
}
}
printf("\nSorting:");
for(k = 1; k <= 10; k++)
{
printf("%d ", data[k]);
}
return 0;
}
void adjust(int i, int n)//将数据调整为堆树
{
int j, k, done = 0;
k = data[i];
j = 2 * i;
while((j <= n)&&(done == 0))
{
if((j < n) && data[j] < data[j + 1])
{
j++;
}
if(k >= data[j])
{
done = 1;
}
else
{
data[j / 2] = data[j];
j *= 2;
}
}
data[j / 2] = k;
}
七、归并排序
#include <stdio.h>
#include <stdlib.h>
void select_sort(int[], int);
void merge_sort(int[], int[], int[], int, int);
int main()
{
int data1[10] = {1, 3, 4, 6, 7};
int data2[10] = {2, 5, 8, 9, 10};
int data3[20];
int size1 = 6, size2 = 6, i;
merge_sort(data1, data2, data3, size1, size2);
printf("\nSorting:");
for(i = 0; i < size1 + size2; i++)
{
printf("%d ", data3[i]);
}
return 0;
}
void select_sort(int data[], int size)
{
int base, compare, min, temp;
for(base = 0; base < size - 1; base++)
{
min = base;
for(compare = base + 1; compare < size; compare++)
{
if(data[compare] < data[min])
{
min = compare;
}
}
temp = data[min];
data[min] = data[base];
data[base] = temp;
}
}
void merge_sort(int data1[], int data2[], int data3[], int size1, int size2)
{
int arg1, arg2, arg3, i;
data1[size1] = 32767;
data2[size2] = 32767;
arg1 = 0;
arg2 = 0;
for(arg3 = 0; arg3 < size1 + size2; arg3++)
{
//比较两组数据, 数据小的先存于归并后的数列
if(data1[arg1] < data2[arg2])
{
data3[arg3] = data1[arg1];
arg1++;
}
else
{
data3[arg3] = data2[arg2];
arg2++;
}
printf("Access:");
for(i = 0; i < arg3 + 1; i++)
{
printf("%d ", data3[i]);
}
printf("\n");
}
}
八、基数排序
#include <stdio.h>
#include <stdlib.h>
void radix_sort(int data[], int size)
{
int i, j, k = 0, n = 1, lsd, temp[size][size];
int order[10] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
while(n <= size)
{
for(i = 0; i < size; i++)
{
lsd = ((data[i] / n) % 10);
temp[lsd][order[lsd]] = data[i];
order[lsd]++;
}
printf("\nAccess:");
for(i = 0; i < size; i++)
{
if(order[i] != 0)
{
for(j = 0; j < order[i]; j++)
{
data[k] = temp[i][j];
printf("%d ", data[k]);
k++;
}
}
order[i] = 0;
}
n *= 10;
k = 0;
}
}
int main()
{
int data[10] = {75, 23, 98, 44, 57, 12, 29, 64, 38, 82};
int i;
printf("Radix sort\n");
printf("\nNumber:");
for(i = 0; i < 10; i++)
{
printf("%d ", data[i]);
}
printf("\n");
radix_sort(data, 10);
printf("\nSorting:");
for(i = 0; i < 10; i++)
{
printf("%d ", data[i]);
}
return 0;
}