#include<stdio.h>
#include<stdlib.h>
void swap(int *a, int *b)
{
int temp = *a;
*a = *b;
*b = temp;
}
void show(int *arr,int sum)
{
for (int i = 0; i < sum; i++)
printf("%d,", arr[i]);
printf("\n");
}
void maopao(int *arr,int sum)//冒泡排序
{
for(int i=0;i<sum;i++)
//for (int j = 0; j < sum - 1 - i; j++) //往后冒
//{
// if (*(arr+j) > *(arr+j+1))
// swap((arr + j), (arr + j+1));
//}
for (int j = sum - 1 ; j > i; j--) //往前冒
{
if (*(arr+j) < *(arr+j-1))
swap((arr + j), (arr + j - 1));
}
printf("\n");
}
void maopaoA(int *arr, int sum)//冒泡排序改进,增加一个标识
{
int flag=1;
for (int i = 0; i<sum&&flag; i++)
{
flag = 0;
for (int j = sum - 1; j > i; j--) //往前冒
{
if (*(arr + j) < *(arr + j - 1))//如果没有任何数据交换,可以结束循环。
{
swap((arr + j), (arr + j - 1));
flag = 1;
}
}
}
printf("\n");
}
//简单选择排序
void simpleSelectSort(int *arr,int sum)
{
int min=0;//记录i次最小数的坐标
for (int i = 0; i < sum; i++)
{
min = i;
for (int j = i+1; j < sum; j++)
{
if (arr[j] < arr[min])
{
min = j;
}
}
swap(arr + i, arr + min);
}
}
//直接插入排序
void insertSort(int *arr, int sum)//插入排序像整理扑克牌,抓一张插入一张
{
// = { 88,5,6,89,7,8,22,9,32,6 };
int f1,f2,i,j;
for ( i = 1; i < sum; i++)
{
if (arr[i-1] > arr[i])
{
f1 = arr[i+1];//记录下一个,因为要往后移动
f2 = arr[i];//设置哨兵(也就事当前摸到的牌)
for (j = i;j>-1 ; j--)//记录往后移
{
arr[j+1] = arr[j];
if (arr[j] < f2)
break;
}
arr[j+1] = f2;//插入当前摸到的扑克牌
arr[i+1] = f1;
//show(arr,10);
}
}
}
void quicksort(int *arr,int left,int right)//快速排序又称双冒泡
{
if (left > right)
return;
int lefti = left;
int rightj = right;
//思路:从左往右找最小,从右往左找最大
for (lefti = left; lefti < right; lefti++)
{
if (arr[left] > arr[lefti])
swap(arr + left, arr + lefti);
}
for (rightj = right; rightj > left; rightj--)
{
if (arr[right] < arr[rightj])
swap(arr + right, arr + rightj);
}
left++;
quicksort(arr, left++, right);
right--;
quicksort(arr, left, right++);
}
//堆排序
void adjustHeap(int * arr,int lens,int lenm)//大顶堆,lenm数组长度,lens=lenm/2 //adjust调整堆
{
int temp = arr[lens];//保存根节点
for (int i = ((lens) * 2)+1; i < lenm; i = i * 2)
{
if (i<lenm-1&&arr[i]<arr[i+1])//(确保arr[i]为3个树中最大)右子树比较大,记录右子树
i++;//
if (arr[i] < temp)//如果比根小,跳出循环
break;
arr[lens] = arr[i];//将arr[i]赋值给根
lens = i; //从i开始再循环,这时候根为下标i的元素****
}
arr[lens] = temp;//循环完后的根为temp
//show(arr, 10);
}
void adjustHeapsmall(int * arr, int lens, int lenm)//小顶堆,lenm数组长度,lens=lenm/2 //adjust调整堆
{
int temp = arr[lens];//保存根节点
for (int i = ((lens) * 2) + 1; i < lenm; i = i * 2)
{
if (i<lenm - 1 && arr[i]>arr[i + 1])//(确保arr[i]为3个树中最小)右子树比较小,记录右子树
i++;//
if (arr[i] > temp)//如果比根小,跳出循环
break;
arr[lens] = arr[i];//将arr[i]赋值给根
lens = i; //从i开始再循环,这时候根为下标i的元素
}
arr[lens] = temp;//循环完后的根为temp
//show(arr, 10);
}
void createHeap(int * arr, int sum)
{
for (int i = (sum / 2)-1; i >-1; i--)//(sum / 2)-1和i >-1是因为数组下标从0开始
adjustHeapsmall(arr, i, sum);//调整堆,找出最大的在arr[0]
}
void heapSort(int * arr,int sum)
{
//堆排序采用二叉树,查找极值放在左边
for (int i = 0; i < sum; i++)
{
createHeap(arr + i, sum - i);
}
}
void main()
{
int arr[10] = { 5,88,6,89,7,8,22,9,32,6 };
show(arr, 10);
//maopaoA(arr,10);
//printf("冒泡排序:");
//show(arr, 10);
//simpleSelectSort(arr, 10);
//printf("简单选择排序:");
//show(arr, 10);
//insertSort(arr, 10);
//printf("插入排序:");
//show(arr, 10);
/*printf("快速(双冒泡)排序:");
quicksort(arr, 0, 9);
show(arr, 10);*/
heapSort(arr,10);
printf("堆排序:");
show(arr,10);
system("pause");
}
数据结构-排序-冒泡排序-快速排序-插入排序-堆排序
最新推荐文章于 2020-12-30 10:44:27 发布