1.插入排序
直接插入、折半插入、希尔 排序
#include <stdio.h>
void arrprint(int arr[],int n){
for (int i = 0; i < n; i++) {
printf("%d ", arr[i]);
}
printf("\n");
}
void arrprint2(int arr[],int n){
for (int i = 1; i < n; i++) {
printf("%d ", arr[i]);
}
printf("\n");
}
void insertSort(int a[], int n) {
int i, j, temp;
for (i = 1; i < n; i++) {
if (a[i] < a[i - 1]) {
temp = a[i];
for (j = i - 1; j >= 0 && a[j] > temp; j--)
a[j + 1] = a[j];
a[j + 1] = temp;
}
}
}
void inserSort2(int a[], int n) {
int i, j, low, mid, high;
for (i = 2; i <= n; i++) {
a[0] = a[i];
low = 1;
high = i - 1;
while (low <= high) {
mid = (low + high) / 2;
if (a[mid] > a[0])
high = mid - 1;
else
low = mid + 1;
}
for (j = i - 1; j >= high + 1; --j)
a[j + 1] = a[j];
a[high + 1] = a[0];
}
}
void ShellSort(int a[],int n){
int dk,i,j;
for(dk=n/2;dk>=1;dk=dk/2){
for(i=dk+1;i<=n; i++){
if(a[i] < a[i-dk]){
a[0]=a[i];
for(j= i-dk;j>0 && a[0]<a[j]; j-=dk)
a[j+dk] = a[j];
a[j+dk] =a[0];
}
}
}
}
int main() {
int arr[] = {12, 11, 13, 5, 6};
int brr[] = {-1,1, 11, 3, 15, 6};
int crr[] = {-1,49,38,65,97,13,27,55,4};
int n1 = sizeof(arr) / sizeof(arr[0]);
int n2 = sizeof(brr) / sizeof(brr[0]);
printf("直接插入排序前:");
arrprint(arr,n1);
insertSort(arr, n1);
printf("排序后: ");
arrprint(arr,n1);
printf("\n");
printf("折半插入排序前:");
arrprint2(brr,n2);
inserSort2(brr, n2);
printf("排序后: ");
arrprint2(brr,n2);
printf("\n");
printf("希尔插入排序前:");
arrprint2(crr,9);
ShellSort(crr, 8);
printf("排序后: ");
arrprint2(crr,9);
printf("\n");
return 0;
}
2.交换排序
冒泡排序、快速排序
#include <stdio.h>
#include <stdlib.h>
void print_sort(int arr[],int n){
for (int i = 0; i < n; i++) {
printf("%d ", arr[i]);
}
printf("\n");
}
void swap(int *a,int *b){
int temp =*a;
*a=*b;
*b=temp;
}
void BubbleSort(int a[],int n){
for(int i=0;i<n;i++){
int flag=0;
for(int j=n-1;j>i;j--){
if(a[j-1] > a[j]){
swap(&a[j-1],&a[j]);
flag=1;
}
}
if(flag=0)
return;
}
}
int Partion(int a[],int low,int high){
int key =a[low];
while(low< high){
while(low <high && a[high] >= key) --high;
a[low] =a[high];
while(low <high && a[low] <= key) ++low;
a[high] =a[low];
}
a[low] =key;
return low;
}
void QuickSort(int a[], int low,int high){
if(low <high){
int key =Partion(a,low,high);
QuickSort(a,low,key-1);
QuickSort(a,key+1,high);
}
}
int main()
{
int a[]= {49,38,65,97,76,13,27,49};
int b[]= {49,38,65,97,76,13,27,49};
printf("初始:");
print_sort(a,8);
printf("冒泡排序后:");
BubbleSort(a,8);
print_sort(a,8);
printf("快速排序后:");
QuickSort(b,0,7);
print_sort(b,8);
return 0;
}
3.选择排序
简单选择排序、堆排序
#include <stdio.h>
#include <stdlib.h>
void print_sort(int arr[],int n){
for (int i = 0; i < n; i++) {
printf("%d ", arr[i]);
}
printf("\n");
}
void print_sort2(int arr[],int n){
for (int i = 1; i < n; i++) {
printf("%d ", arr[i]);
}
printf("\n");
}
void swap(int *a,int *b){
int temp =*a;
*a=*b;
*b=temp;
}
void SelectSort(int a[],int n){
for(int i=0;i<n;i++){
int min =i;
for(int j=i+1;j<n;j++){
if(a[min] >a[j])
min =j;
}
if(min !=i) swap(&a[i],&a[min]);
}
}
void Build(int a[], int n) {
for (int i = n / 2; i > 0; i--) {
HeapAdjust(a, i, n);
}
}
void HeapAdjust(int a[], int k, int n) {
a[0] = a[k];
int i;
for (i = 2 * k; i <= n; i *= 2) {
if (i < n && a[i] > a[i + 1])
i++;
if (a[0] <= a[i])
break;
else {
a[k] = a[i];
k = i;
}
}
a[k] = a[0];
}
void HeapSort(int a[], int n) {
Build(a, n);
Build(a, n);
for (int i = n; i > 1; i--) {
swap(&a[i], &a[1]);
HeapAdjust(a, 1, i - 1);
}
}
int main()
{
int a[]= {49,38,65,97,76,13,27,49};
int b[]= {-1,87,45,88,32,17,65,53,9};
int n1=8,n2=8;
printf("初始:");
print_sort(a,n1);
printf("简单选择排序后:");
SelectSort(a,n1);
print_sort(a,n1);
printf("\n");
printf("初始:");
print_sort2(b,n2+1);
printf("小根堆排序后:");
HeapSort(b,n2);
print_sort2(b,n2+1);
return 0;
}
小根堆插入、删除
#include <stdio.h>
#include <stdlib.h>
void print_sort2(int arr[], int n) {
for (int i = 1; i < n; i++) {
printf("%d ", arr[i]);
}
printf("\n");
}
void swap(int *a, int *b) {
int temp = *a;
*a = *b;
*b = temp;
}
void Build(int a[], int n) {
for (int i = n / 2; i > 0; i--)
HeapAdjust(a, i, n);
}
void HeapAdjust(int a[], int k, int n) {
a[0] = a[k];
for (int i = 2 * k; i <= n; i *= 2) {
if (i < n && a[i] > a[i + 1])
i++;
if (a[0] <= a[i])
break;
else {
a[k] = a[i];
k = i;
}
}
a[k] = a[0];
}
void HeapSort(int a[], int n) {
Build(a, n);
for (int i = n; i > 1; i--) {
swap(&a[i], &a[1]);
HeapAdjust(a, 1, i - 1);
}
}
void Insert(int a[], int *n, int value) {
(*n)++;
a[*n] = value;
int i = *n;
while (i > 1 && a[i] < a[i / 2]) {
swap(&a[i], &a[i / 2]);
i /= 2;
}
}
int DeleteMin(int a[], int *n) {
int min = a[1];
a[1] = a[*n];
(*n)--;
HeapAdjust(a, 1, *n);
return min;
}
int main() {
int b[] = {-1, 87, 45, 78, 32, 17, 65, 53, 9};
int n2 = 8;
printf("初始: ");
print_sort2(b, n2 + 1);
Build(b, n2);
printf("小根堆构建后: ");
print_sort2(b, n2 + 1);
Insert(b, &n2, 20);
printf("插入后的小根堆: ");
print_sort2(b, n2 + 1);
int min = DeleteMin(b, &n2);
printf("删除的最小元素: %d\n", min);
printf("删除后的小根堆: ");
print_sort2(b, n2 + 1);
return 0;
}
4.归并排序、基数排序
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
void print_sort(int a[],int n){
for (int i = 0; i < n; i++) {
printf("%d ", a[i]);
}
printf("\n");
}
int b[8];
void Merge(int a[], int low, int mid, int high){
int i,j,k;
for(k=low; k<=high;k++)
b[k] =a[k];
for(i=low,j =mid+1,k=low;i<=mid && j<=high;k++){
if(b[i] <= b[j])
a[k] = b[i++];
else
a[k] = b[j++];
}
while(i<=mid) a[k++]=b[i++];
while(j<=high) a[k++]=b[j++];
}
void MergeSort(int a[],int low,int high){
if(low< high){
int mid =(low+high)/2;
MergeSort(a,low,mid);
MergeSort(a,mid+1,high);
Merge(a,low,mid,high);
}
}
int main()
{
int a[]= {49,38,65,97,76,13,27,49};
int n = sizeof(a) / sizeof(a[0]);
printf("归并排序前序列:");
print_sort(a,n);
MergeSort(a,0,n-1);
print_sort(a,n);
return 0;
}
5.习题
3.2 双向冒泡排序
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
void swap(int* a,int* b){
int temp=*a;
*a=*b;
*b=temp;
}
void BubbleSort(int a[],int n){
int low=0,high=n-1,i;
bool flag =true;
while(low< high && flag){
flag =false;
for(i=low;i<high;i++){
if(a[i]>a[i+1]){
swap(&a[i],&a[i+1]);
flag=true;
}
}
high--;
for(i=high;i>low;i--){
if(a[i] < a[i-1]){
swap(&a[i],&a[i-1]);
flag=true;
}
}
low++;
}
}
int main()
{
int a[]={7,1,2,9,4,3};
for(int i=0;i<6;i++)
printf("%d ",a[i]);
printf("\n");
BubbleSort(a,6);
printf("双向冒泡后:");
for(int i=0;i<6;i++)
printf("%d ",a[i]);
return 0;
}
3.3 奇偶分开
#include <stdio.h>
#include <stdlib.h>
void swap(int *a,int *b){
int temp =*a;
*a =*b;
*b =temp;
}
void Sort(int a[],int n){
int i=0,j=n-1;
while(i<j){
while(i<j && a[i]%2==1) i++;
while(i<j && a[j]%2==0) j--;
if(i<j)
swap(&a[i++],&a[j--]);
}
}
int main()
{
int a[]={7,1,2,9,4,3};
for(int i=0;i<6;i++)
printf("%d ",a[i]);
printf("\n");
Sort(a,6);
printf("奇偶排序后:");
for(int i=0;i<6;i++)
printf("%d ",a[i]);
return 0;
return 0;
}
3.7 分区 最大区最小区的和差最大 长度差最小
void Sort(int a[],int n){
int key,low=0,low1=0,high=n-1,high1=n-1,flag=1,k=n/2,i;
int s1=0,s2=0;
while(flag){
key= a[low];
while(low<high){
while(low<high && a[high] >= key) --high;
if(low !=high) a[low] =a[high];
while(low<high && a[low] <= key) ++low;
if(low!=high) a[high]=a[low];
}
a[low] =key;
if(low == k-1)
flag=0;
else{
if(low < k-1){
low1 = ++low;
high=high1;
}
else{
high1 =--high;
low =low1;
}
}
}
for(i=0;i<k;i++) s1+=a[i];
for(i=k;i<n;i++) s2+=a[i];
return s2-s1;
}
4.4 单链表简单选择排序
#include <stdio.h>
#include <stdlib.h>
typedef struct node {
int data;
struct node* next;
} node, *linklist;
linklist init_list() {
linklist lt = (linklist)malloc(sizeof(node));
if (lt == NULL) {
printf("内存分配失败!\n");
return NULL;
}
lt->next = NULL;
return lt;
}
void print_list(linklist lt) {
lt = lt->next;
if (lt == NULL) {
printf("链表为空!\n");
return;
}
printf("链表中的元素:");
while (lt) {
printf("%d\t", lt->data);
lt = lt->next;
}
printf("\n");
}
linklist head_insert(linklist lt) {
int n = 0, e = 0;
printf("请输入要插入的元素个数:");
scanf("%d", &n);
printf("请输入要插入的元素:");
for (int i = 0; i < n; i++) {
node* s = (node*)malloc(sizeof(node));
scanf("%d", &e);
s->data = e;
s->next = lt->next;
lt->next = s;
}
return lt;
}
void SelectSort(linklist lt) {
node *p, *q, *min, *temp;
p = lt->next;
while (p != NULL) {
min = p;
q = p->next;
while (q != NULL) {
if (q->data < min->data) {
min = q;
}
q = q->next;
}
if (min != p) {
temp = p->data;
p->data = min->data;
min->data = temp;
}
p = p->next;
}
}
int main() {
linklist lt = init_list();
lt = head_insert(lt);
print_list(lt);
printf("简单选择排序后的链表:");
SelectSort(lt);
print_list(lt);
return 0;
}
4.5 判断是否为小根堆
#include <stdio.h>
#include <stdlib.h>
void print_sort2(int arr[],int n){
for (int i = 1; i < n; i++) {
printf("%d ", arr[i]);
}
printf("\n");
}
void swap(int *a,int *b){
int temp =*a;
*a=*b;
*b=temp;
}
void Build(int a[],int n){
for(int i=n/2;i>0;i--)
HeapAdjust(a,i,n);
}
void HeapAdjust(int a[],int k,int n){
a[0] = a[k];
for(int i=2*k; i<= n; i*=2){
if(i<n && a[i] <a[i+1]) i++;
if(a[0] >= a[i]) break;
else{
a[k] =a[i];
k=i;
}
}
a[k] = a[0];
}
void HeapSort(int a[],int n){
Build(a,n);
for(int i=n;i>1;i--){
swap(&a[i],&a[1]);
HeapAdjust(a,1,i-1);
}
}
int minHeap(int a[],int n){
if(n %2 ==0){
if(a[n/2] > a [n])
return 0;
for (int i = n / 2 - 1; i >= 1; i--) {
if (a[i] > a[2 * i] || a[i] > a[2 * i + 1])
return 0;
}
}
else{
for (int i = n / 2 - 1; i >= 1; i--) {
if (a[i] > a[2 * i] || a[i] > a[2 * i + 1])
return 0;
}
}
printf("是小根堆\n");
return 1;
}
int main()
{
int b[]= {-1,87,45,78,32,17,65,53,9};
int n2=8;
printf("初始:");
print_sort2(b,n2+1);
minHeap(b,n2);
printf("小根堆排序后:");
HeapSort(b,n2);
print_sort2(b,n2+1);
minHeap(b,n2);
b[1]=18;
print_sort2(b,n2+1);
minHeap(b,n2);
return 0;
}