資料結構之八大排序方法
阿新 • • 發佈:2019-02-19
插入排序:
插入排序分為直接插入排序和希爾排序
#直接插入排序
/************************************************************** > File Name: insert.c > Author: chengfeiyan > Mail: [email protected] > Created Time: 2018年08月12日 星期日 09時50分41秒 **************************************************************/ /*直接插入排序*/ #include <stdio.h> void Insertsort(int b[], int size) { int i, j, tmp; for(i = 1; i < size; i++) { tmp = b[i]; for(j = i - 1; j >= 0; j--) { if(tmp < b[j]) { b[j + 1] = b[j]; } else { break; } } b[j + 1] = tmp; } } int main() { int i, length; int a[10] = {9, 8, 4, 7, 0, 4, 3, 5, 2, 7}; length = sizeof(a) / sizeof(a[0]); Insertsort(a, length); for(i = 0; i < length; i++) { printf("%d ", a[i]); } printf("\n"); return 0; }
#希爾排序
/************************************************************** > File Name: insert.c > Author: chengfeiyan > Mail: [email protected] > Created Time: 2018年08月12日 星期日 09時50分41秒 **************************************************************/ /*希爾排序*/ #include <stdio.h> void ShellSort(int b[], int size) { int i, j, tmp, h; for(h = size / 2; h > 0; h /= 2) { for(i = 1; i < size; i++) { tmp = b[i]; for(j = i - 1; j >= 0; j--) { if(tmp < b[j]) { b[j + 1] = b[j]; } else { break; } } b[j + 1] = tmp; } } } int main() { int i, length; int a[10] = {9, 8, 4, 7, 0, 4, 3, 5, 2, 7}; length = sizeof(a) / sizeof(a[0]); ShellSort(a, length); for(i = 0; i < length; i++) { printf("%d ", a[i]); } printf("\n"); return 0; }
選擇排序:
選擇排序分為簡單選擇排序和堆排序
# 簡單選擇排序
/************************************************************** > File Name: Choose.c > Author: chengfeiyan > Mail: [email protected] > Created Time: 2018年08月12日 星期日 14時28分32秒 **************************************************************/ /*簡單選擇排序*/ #include <stdio.h> void ChooseSort(int *num, int n) { int i, j, tmp = 0, min = 0; for(i = 0; i < n ; i++) { min = i; for(j = i + 1; j < n; j++) { if(num[j] < num[min]) { min = j; } } if(num[i] != num[j]) { tmp = num[i]; num[i] = num[min]; num[min] = tmp; } } } int main() { int i, len; int a[] = {1, 2, 6, 34, 22, 5, 3}; len = sizeof(a) / sizeof(a[0]); ChooseSort(a, len); for(i = 0; i < len; i++) { printf("%d ", a[i]); } printf("\n"); return 0; }
#堆排序
/**************************************************************
> File Name: heap.c
> Author: chengfeiyan
> Mail: [email protected]
> Created Time: 2018年08月12日 星期日 14時40分03秒
**************************************************************/
/*堆排序*/
#include <stdio.h> //堆排序
void AdjustMinHeap(int *a, int pos, int len)
{
int temp;
int child;
for (temp = a[pos]; 2 * pos + 1 <= len; pos = child)
{
child = 2 * pos + 1;
if (child < len && a[child] > a[child + 1])
{
child++;
}
if (a[child] < temp)
{
a[pos] = a[child];
}
else
{
break;
}
}
a[pos] = temp;
}
void Swap(int *a, int *b) //交換
{
int temp;
temp = *a;
*a = *b;
*b = temp;
}
void PrintArray(int *a, int length)
{
int i;
for (i = 0; i < length; i++)
{
printf("%d ", a[i]);
}
printf("\n");
}
void HeapSort(int *array, int len)
{
int i;
for (i = len / 2 - 1; i >= 0; i--)
{
AdjustMinHeap(array, i, len - 1);
}
for (i = len -1; i >= 0; i--)
{
Swap(&array[0], &array[i]);
AdjustMinHeap(array, 0, i - 1);
}
}
int main()
{
int array[] = {0, 13, 1, 14, 27, 18};
int length = sizeof(array) / sizeof(array[0]);
HeapSort(array, length);
PrintArray(array, length);
return 0;
}
交換排序:
交換排序分為氣泡排序和快速排序
#氣泡排序
/**************************************************************
> File Name: sort.c
> Author: chengfeiyan
> Mail: [email protected]
> Created Time: 2018年08月12日 星期日 16時20分32秒
**************************************************************/
/*氣泡排序*/
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int greater(int x, int y)
{
return (x > y) ? 1 : 0;
}
int less (int x, int y)
{
return (x < y) ? 1 : 0;
}
void Getarray(int a[], int length)
{
int i;
printf("Please input:\n");
for(i = 0; i < length; i++)
{
scanf("%d", &a[i]);
}
}
void sort(int a[], int length, int (*p)(int, int))
{
int i, j, tmp;
for(i = 0; i < length - 1 ; i++)
{
for(j = 0; j < length - i - 1; j++)
{
if(p(a[j + 1], a[j]))
{
tmp = a[j + 1];
a[j + 1] = a[j];
a[j] = tmp;
}
}
}
void print(int a[], int length)
{
int i = 0;
for(i = 0; i < length; i++)
{
printf("%d", a[i]);
}
}
int main()
{
int i, j, temp;
int a[5] = {0};
int length = sizeof(a) / sizeof(a[0]);
int (*p)();
return 0;
}
}
#快速排序
/**************************************************************
> File Name: sort.c
> Author: chengfeiyan
> Mail: [email protected]
> Created Time: 2018年08月12日 星期日 16時20分32秒
**************************************************************/
/*氣泡排序*/
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int greater(int x, int y)
{
return (x > y) ? 1 : 0;
}
int less (int x, int y)
{
return (x < y) ? 1 : 0;
}
void Getarray(int a[], int length)
{
int i;
printf("Please input:\n");
for(i = 0; i < length; i++)
{
scanf("%d", &a[i]);
}
}
void sort(int a[], int length, int (*p)(int, int))
{
int i, j, tmp;
for(i = 0; i < length - 1 ; i++)
{
for(j = 0; j < length - i - 1; j++)
{
if(p(a[j + 1], a[j]))
{
tmp = a[j + 1];
a[j + 1] = a[j];
a[j] = tmp;
}
}
}
void print(int a[], int length)
{
int i = 0;
for(i = 0; i < length; i++)
{
printf("%d", a[i]);
}
}
int main()
{
int i, j, temp;
int a[5] = {0};
int length = sizeof(a) / sizeof(a[0]);
int (*p)();
return 0;
}
}
基數排序:
/**************************************************************
> File Name: insert.c
> Author: chengfeiyan
> Mail: [email protected]
> Created Time: 2018年08月12日 星期日 09時50分41秒
**************************************************************/
/*基數排序*/
#include <stdio.h>
#include <stdlib.h>
/*******************
* 獲取陣列a中最大值
*
* 引數說明:
* a -- 陣列
* n -- 陣列長度
*******************/
int Get_max(int *a, int n)
{
int i, max;
max = a[0];
for( i = 1; i < n; i++)
{
if(a[i] > max)
{
max = a[i];
}
}
return max;
}
/*************************************
* 對陣列按照"某個位數"進行排序(桶排序)
*
* 引數說明:
* a -- 陣列
* n -- 陣列長度
* exp -- 指數。對陣列a按照該指數進行排序。
*
* 例如,對於陣列a={278, 109, 63, 930, 589, 184, 505, 269, 8, 83};
* (01) 當exp=1表示按照"個位"對陣列a進行排序
* (02) 當exp=10表示按照"十位"對陣列a進行排序
* (03) 當exp=100表示按照"百位"對陣列a進行排序
* ...
**************************************/
int count_sort(int *a, int n, int exp)
{
int output[n]; // 儲存"被排序資料"的臨時陣列
int i;
int buckets[10] = {0}; //桶陣列
// 將資料最後一位對應的數儲存在buckets[]對應的桶中,則該桶++
for(i = 0; i < n; i++)
{
buckets[(a[i] / exp) % 10 ] ++;
}
//更改buckets[i]。目的是讓更改後的buckets[i]的值,是該資料在output[]中的位置。
for(i = 1; i < 10; i++)
{
buckets[i] += buckets[i - 1];
}
// 將資料儲存到臨時陣列output[]中
for( i = n - 1; i >= 0; i--)
{
output[buckets[ (a[i] / exp) % 10 ] -1 ] = a[i];
buckets[ (a[i] / exp) % 10]--;
}
// 將排序好的資料賦值給a[]
for(i = 0; i < n; i++)
{
a[i] = output[i];
}
return 1;
}
/******************
* 基數排序
*
* 引數說明:
* a -- 陣列
* n -- 陣列長度
******************/
int Radix_sort(int *a, int n)
{
int exp; //指數,對個位排序為1,對十位排序為10...
int max = Get_max(a, n); // 陣列a中的最大值
// 從個位開始,對陣列a按"指數"進行排序
for(exp = 1; max / exp > 0; exp *= 10)
{
count_sort( a, n, exp);
}
return 1;
}
int main()
{
int i;
int a[] = {278, 109, 63, 930, 589, 184, 505, 269, 8, 83};//按照PPT上的資料
int len = sizeof(a) / sizeof(a[0]); //求陣列的長度
printf("Before sort : ");
for(i = 0; i < len; i ++)
{
printf("%d ", a[i]);
}
printf("\n\n");
Radix_sort(a, len);
printf("After sort : ");
for(i = 0; i < len; i++)
{
printf("%d ", a[i]);
}
printf("\n");
return 0;
}
歸併排序:
/**************************************************************
> File Name: insert.c
> Author: chengfeiyan
> Mail: [email protected]
> Created Time: 2018年08月12日 星期日 09時50分41秒
**************************************************************/
/*歸併排序*/
#include<stdio.h>
#include<stdlib.h>
void Merge(int a[],int start, int middle,int end )
{
int num1 = middle + 1 - start;
int num2 = end - middle;
int *A = (int*)malloc(sizeof(int) *num1);
int *B = (int*)malloc(sizeof(int) *num2);
int i,j,k;
for(i = 0,k = start; i < num1 ;i++,k++)
{
A[i] = a[k];
}
for(j = 0,k = middle + 1;j < num2 ;j++,k++)
{
B[j] = a[k];
}
for(i = 0, j = 0,k = start ;i < num1 && j < num2; k++)
{
if( A[i] < B[j] )
{
a[k] = A[i];
i++;
}
else
{
a[k] = B[j];
j++;
}
}
if( i < num1 )
{
for( j = i;j < num1 ;j++,k++)
{
a[k] = A[j];
}
}
if( j < num2 )
{
for( i = j;i < num2 ;i++,k++)
{
a[k] = B[i];
}
}
}
void MergeSort(int a[], int start, int end )
{
int i;
int middle;
if(start < end )
{
middle = ( start + end ) / 2;
MergeSort(a, start, middle );
/* i=0;
while( i < 4 )
{
printf("%d ",a[i]);
i++;
}
printf("\n");*/
MergeSort(a, middle + 1, end );
/* i=4;
while( i < 8 )
{
printf("%d ",a[i]);
i++;
}
printf("\n");*/
Merge(a,start,middle,end);
}
}
int main()
{
int i = 0;
int a[]= {8,4,5,7,1,3,6,2};
int length = sizeof( a ) / sizeof( a[0] );
MergeSort(a, 0, length - 1);
while( i < length )
{
printf("%d ",a[i]);
i++;
}
printf("\n");
return 0;
}