排序:
1、冒泡排序
#include <stdio.h>
void mySwap(int *a, int i, int j)
{
int tmp = a[i];
a[i] = a[j];
a[j] = tmp;
}
void myPrint(int *a, int len)
{
int i;
for (i = 0; i < len; i++)
{
printf ("%4d", a[i]);
}
printf ("\n");
}
void mySort(int *a, int len)
{
int left = 0;
int right = len-1;
int i;
while (left < right)
{
for (i = left; i < right; i++) // 从左往右走,找最大元素沉底
{
if (a[i] > a[i+1])
{
mySwap(a, i, i+1);
}
}
right--;
for (i = right; i>left; i--) // 从右往左走,找最小元素上浮
{
if (a[i] < a[i-1])
{
mySwap(a, i, i-1);
}
}
left++;
}
}
void mySort1(int *a, int left, int right)
{
if (left >= right)
return;
int i;
for (i = left; i < right; i++) // 从左往右走,找最大元素沉底
{
if (a[i] > a[i+1])
{
mySwap(a, i, i+1);
}
}
right--;
for (i = right; i>left; i--) // 从右往左走,找最小元素上浮
{
if (a[i] < a[i-1])
{
mySwap(a, i, i-1);
}
}
left++;
mySort1(a, left, right);
}
int main()
{
int a[] = {9,8,7,6,5,4,3,2,1,0};
int len = sizeof(a)/sizeof(a[0]);
// mySort(a, len);
mySort1(a, 0, len-1);
myPrint(a, len);
return 0;
}
2、冒泡排序改进
#include <stdio.h>
void mySwap(int *a, int i, int j)
{
int tmp = a[i];
a[i] = a[j];
a[j] = tmp;
}
void mySort(int *a, int len)
{
int i, j;
for (i=0; i < len-1; i++) // 将最大元素沉底的次数
{
for (j = 0; j < len-1-i; j++) // 将当前数组最大元素沉底
{
if (a[j] > a[j+1])
{
mySwap(a, j, j+1); // 交换
}
}
}
}
void mySort1(int *a, int len)
{
if (len == 1)
return;
int i, j;
for (j = 0; j < len-1; j++)
{
if (a[j] > a[j+1])
{
mySwap(a, j, j+1); // 交换
}
}
mySort1(a, len-1);
}
void myPrint(int *a, int len)
{
int i;
for (i = 0; i < len; i++)
{
printf ("%4d", a[i]);
}
printf ("\n");
}
int main()
{
int a[] = {9,8,7,6,5,4,3,2,1,0};
int len = sizeof(a)/sizeof(a[0]);
// mySort(a, len);
mySort1(a, len);
myPrint(a, len);
return 0;
}
3、选择排序
#include <stdio.h>
void mySwap(int *a, int i, int j)
{
int tmp = a[i];
a[i] = a[j];
a[j] = tmp;
}
void myPrint(int *a, int len)
{
int i;
for (i = 0; i < len; i++)
{
printf ("%4d", a[i]);
}
printf ("\n");
}
void mySort(int *a, int len)
{
int i, j;
for (i = 0; i < len-1; i++) // 找的次数
{
int min = i;
for (j = i+1; j < len; j++)
{
if (a[min] > a[j])
{
min = j;
}
}
if (min != i)
mySwap(a, min, i);
}
}
int main()
{
int a[] = {9,8,7,6,5,4,3,2,1,0};
int len = sizeof(a)/sizeof(a[0]);
mySort(a, len);
myPrint(a, len);
return 0;
}
4、插入排序
#include <stdio.h>
void mySwap(int *a, int i, int j)
{
int tmp = a[i];
a[i] = a[j];
a[j] = tmp;
}
void myPrint(int *a, int len)
{
int i;
for (i = 0; i < len; i++)
{
printf ("%4d", a[i]);
}
printf ("\n");
}
void mySort(int *a, int len)
{
int i;
for (i = 1; i < len; i++)
{
int get = a[i];
int j = i-1;
while (j >= 0 && a[j]>get)
{
a[j+1] = a[j];
j--;
}
a[j+1] = get;
}
}
int main()
{
int a[] = {9,8,7,6,5,4,3,2,1,0};
int len = sizeof(a)/sizeof(a[0]);
mySort(a, len);
myPrint(a, len);
return 0;
}
5、二分插入排序
#include <stdio.h>
void mySwap(int *a, int i, int j)
{
int tmp = a[i];
a[i] = a[j];
a[j] = tmp;
}
void myPrint(int *a, int len)
{
int i;
for (i = 0; i < len; i++)
{
printf ("%4d", a[i]);
}
printf ("\n");
}
void mySort(int *a, int len)
{
int i;
for (i = 1; i < len; i++)
{
int get = a[i];
int left = 0;
int right = i-1;
while (left <= right)
{
int mid = (left+right)/2; // 中间元素的下标
if (a[mid] > get)
right = mid-1;
else
left = mid+1;
}
// 移位
int j;
for (j = i-1; j >= left; j--)
a[j+1] = a[j];
a[left] = get;
}
}
int main()
{
int a[] = {9,8,7,6,5,4,13,3,2,1,0};
int len = sizeof(a)/sizeof(a[0]);
mySort(a, len);
myPrint(a, len);
return 0;
}
6、希尔排序
#include <stdio.h>
void mySwap(int *a, int i, int j)
{
int tmp = a[i];
a[i] = a[j];
a[j] = tmp;
}
void myPrint(int *a, int len)
{
int i;
for (i = 0; i < len; i++)
{
printf ("%4d", a[i]);
}
printf ("\n");
}
void mySort(int *a, int len)
{
int gap = 1;
while(gap < len)
{
gap = gap*3+1;
}
while (gap > 0)
{
int i;
for (i = gap; i < len; i++)
{
int get = a[i];
int j = i-gap;
while (j >= 0 && a[j]>get)
{
a[j+gap] = a[j];
j -= gap;
}
a[j+gap] = get;
}
printf ("gap = %d : ", gap);
myPrint(a, len);
gap = gap / 3;
}
}
int main()
{
int a[] = {9,8,7,6,5,4,3,2,1,0};
int len = sizeof(a)/sizeof(a[0]);
mySort(a, len);
myPrint(a, len);
return 0;
}
7、堆排序
#include <stdio.h>
void mySwap(int *a, int i, int j)
{
int tmp = a[i];
a[i] = a[j];
a[j] = tmp;
}
void myPrint(int *a, int len)
{
int i;
for (i = 0; i < len; i++)
{
printf ("%4d", a[i]);
}
printf ("\n");
}
// 调整堆
void herify(int *a, int index, int len)
{
int lindex = 2*index + 1; // 左孩子结点下标
int rindex = 2*index + 2; // 右孩子结点下标
int max = index;
if (lindex<len && a[max]<a[lindex])
max = lindex;
if (rindex<len && a[max]<a[rindex])
max = rindex;
if (max != index)
{
mySwap(a, max, index);
herify(a, max, len);
}
}
void mySort(int *a, int len)
{
// 建堆: 从非叶节点开始,把每一个结点搞成大顶堆
int i;
for (i = len/2-1; i>=0; i--)
{
herify(a, i, len);
}
// 排序
int count = len;
for (i=len-1; i > 0; i--)
{
mySwap(a, 0, i); // 堆顶元素和当前堆最后一个元素进行交换
count--;
herify(a, 0, count);
}
}
int main()
{
int a[] = {5,8,6,7,9,4,3,2,1,0};
int len = sizeof(a)/sizeof(a[0]);
mySort(a, len);
myPrint(a, len);
return 0;
}
8、归并排序
#include <stdio.h>
void mySwap(int *a, int i, int j)
{
int tmp = a[i];
a[i] = a[j];
a[j] = tmp;
}
void myPrint(int *a, int len)
{
int i;
for (i = 0; i < len; i++)
{
printf ("%4d", a[i]);
}
printf ("\n");
}
void merge(int *a, int left, int mid, int right, int *tmp)
{
int i = left; // 左半边数组下标
int j = mid+1; // 右半边数组下标
int k = 0; // 临时数组使用的下标
while(i<=mid && j<=right)
{
if (a[i] < a[j])
tmp[k++] = a[i++];
else
tmp[k++] = a[j++];
}
while(i<=mid)
{
tmp[k++] = a[i++];
}
while (j<=right)
{
tmp[k++] = a[j++];
}
for(i = 0; i < k; i++)
{
a[left+i] = tmp[i];
}
}
void mergeSort(int *a, int left, int right, int *tmp)
{
int mid = (left+right)/2;
if (left < right)
{
mergeSort(a, left, mid, tmp); // 对左边数组进行归并排序
mergeSort(a, mid+1, right, tmp); // 对右边数组进行归并排序
merge(a, left, mid, right, tmp); // 合并左右两个数组
}
}
int main()
{
int a[] = {5,8,6,7,9,4,3,2,1,0};
int len = sizeof(a)/sizeof(a[0]);
int tmp[10];
mergeSort(a, 0, len-1, tmp);
myPrint(a, len);
return 0;
}
9、快速排序
#include <stdio.h>
void mySwap(int *a, int i, int j)
{
int tmp = a[i];
a[i] = a[j];
a[j] = tmp;
}
void myPrint(int *a, int len)
{
int i;
for (i = 0; i < len; i++)
{
printf ("%4d", a[i]);
}
printf ("\n");
}
int partion(int *a, int left, int right)
{
int pivot = a[right]; // 以最后一个元素作为基准值
while(left < right)
{
while (a[left] <= pivot && left < right)
{
left++;
}
if (left < right)
{
a[right] = a[left];
right--;
}
while (a[right] >= pivot && left < right)
{
right--;
}
if (left < right)
{
a[left] = a[right];
left++;
}
}
a[left] = pivot;
return left;
}
void quickSort(int *a, int left, int right)
{
if (left < right)
{
int pivotIndex = partion(a, left, right); // 算基准值下标
quickSort(a, left, pivotIndex-1); // 对左半部分做快速排序
quickSort(a, pivotIndex+1, right); // 对右半部分做快速排序
}
}
int main()
{
int a[] = {5,8,6,0,9,4,3,2,1,7};
int len = sizeof(a)/sizeof(a[0]);
quickSort(a, 0, len-1);
myPrint(a, len);
return 0;
}