目录
文章目录
分享给你们,不喜勿喷
#include<stdio.h>
#include<stdlib.h>
/*交换变量*/
void Swap(int* a, int* b)
{
int temp = *a;
*a = *b;
*b = temp;
}
/*输出排序*/
void Print(int array[], int len)
{
int i;
for(i=0;i<len;i++)
{
printf("%d ",array[i]);
}
printf("\n");
}
/*直接插入排序*/
void CRPX(int array[], int len)
{
printf("初始序列:\n");
Print(array, len);
int i, j;
for (i = 1; i < len; i++) {
int tem = array[i];
for (j = i - 1; tem <= array[j] && j >= 0; j--) {
array[j + 1] = array[j];
}
array[j + 1] = tem; //待排序元素 大于 有序序列最后一个元素 直接将该元素插入到有序序列最后
}
printf("\n排序完成!\n\n");
}
/*希尔排序*/
void XEPX(int array[], int len)
{
printf("初始序列:\n");
Print(array, len);
int gap = len;
while (gap > 1)
{
gap = gap / 3 + 1; //调整希尔增量
int i = 0;
for (i = 0; i < len - gap; i++) //从0遍历到size-gap-1
{
int end = i;
int temp = array[end + gap];
while (end >= 0)
{
if (array[end] > temp)
{
array[end + gap] = array[end];
end -= gap;
}
else
{
break;
}
}
array[end + gap] = temp; //以 end+gap 作为插入位置
}
}
}
/*冒泡排序*/
void MPPX(int array[], int len)
{
printf("初始序列:\n");
Print(array, len);
int j, i, tem;
for (i = 0; i < len - 1; i++)
{
int count = 0;
for (j = 0; j < len - 1 - i; j++)
{
if (array[j] > array[j + 1])
{
Swap(&array[j],&array[j+1]);
count = 1;
}
}
if (count == 0)//如果某一趟没有交换位置,则说明已经排好序,直接退出循环
break;
}
}
/*取中值函数*/
int GetMidIndex(int* array, int left, int right,int len)
{
printf("初始序列:\n");
Print(array, len);
int mid = (left + right) / 2;
if (array[left] < array[right])
{
if (array[mid] < array[left])
{
return left;
}
else if (array[mid] < array[right])
{
return mid;
}
else
{
return right;
}
}
else
{
if (array[mid] < array[right])
{
return right;
}
else if (array[mid] < array[left])
{
return mid;
}
else
{
return left;
}
}
}
/*快速排序挖坑法单趟排序*/
int KSPX(int array[], int left, int right,int len)
{
printf("初始序列:\n");
Print(array, len);
int hole;
int key;
//获取基准值,并与left交换位置
key = GetMidIndex(array, left, right,len);
Swap(&array[key], &array[left]);
key = array[left];
hole = left;
while (left < right)
{
while (left < right && array[right] >= key)
{
right--;
}
array[hole] = array[right];
hole = right;
while (left < right && array[left] <= key)
{
left++;
}
array[hole] = array[left];
hole = left;
}
array[hole] = key;
return hole;
}
/*选择排序*/
void XZPX(int array[], int len)
{
printf("初始序列:\n");
Print(array, len);
int max;
int begin = 0;
int end = len - 1;
while (begin < end)
{
int max = begin;
int min = begin;
int i = 0;
for (i = begin + 1; i <= end; i++)
{
if (array[i] < array[min])
{
min = i;
}
if (array[i] > array[max])
{
max = i;
}
}
Swap(&array[begin], &array[min]);
if (begin == max) //修正max
{
max = min;
}
Swap(&array[end], &array[max]);
begin++;
end--;
}
}
void HeapAdjust(int array[], int start, int end)
{
int tmp = array[start];
for (int i = 2 * start + 1; i <= end; i = i * 2 + 1)
{
if (i < end && array[i] < array[i + 1])//有右孩子并且左孩子小于右孩子
{
i++;
}//i一定是左右孩子的最大值
if (array[i] > tmp)
{
array[start] = array[i];
start = i;
}
else
{
break;
}
}
array[start] = tmp;
}
/*堆排序*/
void DPX(int array[], int len)
{
printf("初始序列:\n");
Print(array, len);
//第一次建立大根堆,从后往前依次调整
for (int i = (len - 1 - 1) / 2; i >= 0; i--)
{
HeapAdjust(array, i, len - 1);
}
//每次将根和待排序的最后一次交换,然后在调整
int tmp;
for (int i = 0; i < len - 1; i++)
{
tmp = array[0];
array[0] = array[len - 1 - i];
array[len - 1 - i] = tmp;
HeapAdjust(array, 0, len - 1 - i - 1);
}
}
/*退出*/
int EXIT()
{
exit(0);
}
int main()
{
printf("--------------Meun------------------------------\n");
printf("************(1)插入排序************\n");
printf("************(2)希尔排序************\n");
printf("************(3)冒泡排序************\n");
printf("************(4)快速排序************\n");
printf("************(5)选择排序************\n");
printf("************(6)堆排序 ************\n");
printf("************(7)退出 ************\n");
printf("--------------------------------------------------\n");
printf("请输入1~7的整数:\n");
int Input;
scanf("%d", &Input);
int array[10] = { 4,3,10,5,6,7,1,2,8,9 };
int len = 10;
int left,right;
switch (Input)
{
case 1:
CRPX(array,len);
printf("排序后序列:\n");
Print(array, len);
break;
case 2:
XEPX(array,len);
printf("排序后序列:\n");
Print(array, len);
break;
case 3:
MPPX(array,len);
printf("排序后序列:\n");
Print(array, len);
break;
case 4:
KSPX(array,left, right,len);
printf("排序后序列:\n");
Print(array, len);
break;
case 5:
XZPX(array,len);
printf("排序后序列:\n");
Print(array, len);
break;
case 6:
DPX(array, len);
printf("排序后序列:\n");
Print(array, len);
break;
case 7:
EXIT();
break;
default:
break;
}
return 0;
}
收获
void Swap(int* a, int* b) {
int temp = *a;
*a = *b;
*b = temp;
}
调用 Swap(array[j], array[j+1]); 时,编译器会尝试将 array[j] 和 array[j+1] 这两个 int 类型的值转换为 int* 类型的指针,这是错误的。
注意:Swap(&array[j], &array[j+1]);
另一种写法:
void Swap(int& a, int& b) {
int temp = a;
a = b;
b = temp;
}