一、冒泡排序
#include<sys/timeb.h> //这个可以精确到毫秒
#define MAX 10000
//获取精确的时间函数
long getSystemTime()
{
struct timeb tb;
ftime(&tb);
return tb.time * 1000 + tb.millitm;
}
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<time.h>
#include<sys/timeb.h> //这个可以精确到毫秒
#define MAX 10000
//获取精确的时间函数
long getSystemTime()
{
struct timeb tb;
ftime(&tb);
return tb.time * 1000 + tb.millitm;
}
//交换函数
void swap(int *a, int *b)
{
int temp;
temp = *a;
*a = *b;
*b = temp;
}
//冒泡排序
void BubbleSort(int arr[],int len)
{
for (int i = 0; i < len - 1; i++)//i = 0; i<len - 1
{ for (int j = 0; j < len - i - 1; j++) //j = 0; j<len - j - 1
{
if (arr[j] > arr[j+1])
{
swap(&arr[j], &arr[j+1]);
}
}
}
}
void PrintArray(int arr[],int len)
{
for (int i = 0; i < len; i++)
{
printf("%d ",arr[i]);
}
printf("\n");
}
int main(void)
{
int arr[MAX];
srand((unsigned int)time(NULL));
for (int i = 0; i < MAX; i++)
{
arr[i] = rand() % MAX;
}
printf("排序前:\n ");
PrintArray(arr,MAX);
long tstart = getSystemTime();
BubbleSort(arr,MAX);
long tend = getSystemTime();
printf("排序后:\n ");
PrintArray(arr, MAX);
printf("冒泡排序%d个元素,所需时间%ld\n",MAX,tend-tstart);
system("pause");
return 0;
}
二、选择排序
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<time.h>
#include<sys/timeb.h> //这个可以精确到毫秒
#define MAX 100000
//获取精确的时间函数
long getSystemTime()
{
struct timeb tb;
ftime(&tb);
return tb.time * 1000 + tb.millitm;
}
//交换函数
void swap(int *a, int *b)
{
int temp;
temp = *a;
*a = *b;
*b = temp;
}
//冒泡排序
void BubbleSort(int arr[],int len)
{
for (int i = 0; i < len - 1; i++)//i = 0; i<len - 1
{ for (int j = 0; j < len - i - 1; j++) //j = 0; j<len - j - 1
{
if (arr[j] > arr[j+1])
{
swap(&arr[j], &arr[j+1]);
}
}
}
}
void PrintArray(int arr[],int len)
{
for (int i = 0; i < len; i++)
{
printf("%d ",arr[i]);
}
printf("\n");
}
//选择排序
void SelectSort(int arr[],int len)
{
//选择排序是不是减少交换次数
for (int i = 0; i < len; i++)
{
int min = i;
for (int j = i + 1; j < len; j++)
{
if (arr[j] < arr[min])
{
min = j;
}
}
if (min != i)
{
swap(&arr[min], &arr[i]);
}
}
}
int main(void)
{
int arr[MAX];
srand((unsigned int)time(NULL));
for (int i = 0; i < MAX; i++)
{
arr[i] = rand() % MAX;
}
//冒泡排序
long tbubble_start = getSystemTime();
BubbleSort(arr,MAX);
long tbubble_end = getSystemTime();
printf("冒泡排序%d个元素,所需时间%ld\n",MAX, tbubble_end- tbubble_start);
//选择排序
long tselect_start = getSystemTime();
SelectSort(arr, MAX);
long tselect_end = getSystemTime();
printf("冒泡排序%d个元素,所需时间%ld\n", MAX, tselect_end - tselect_start);
system("pause");
return 0;
}
三、插入排序
插入排序
//基本有序的排列的情况下,效率是非常高的,或者元素的个数比较少的时候,效率也是比较高的
将序列分为两部分,一部分是有序的,一部分是无序的。
核心代码:
//插入排序
//基本有序的排列的情况下,效率是非常高的,或者元素的个数比较少的时候,效率也是比较高的
void InsertSort(int arr[], int len)
{
int j=0;
for (int i = 1; i < len; i++)
{
if (arr[i] < arr[i - 1])
{
int temp = arr[i];
for (int j = i - 1; j >= 0 && temp < arr[j]; j--)//两个判断条件
{
arr[j + 1] = arr[j];
}
arr[j + 1] = temp;
}
}
}
完整代码如下:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<time.h>
#include<sys/timeb.h> //这个可以精确到毫秒
#define MAX 10000
//获取精确的时间函数
long getSystemTime()
{
struct timeb tb;
ftime(&tb);
return tb.time * 1000 + tb.millitm;
}
//交换函数
void swap(int *a, int *b)
{
int temp;
temp = *a;
*a = *b;
*b = temp;
}
//冒泡排序
void BubbleSort(int arr[],int len)
{
for (int i = 0; i < len - 1; i++)//i = 0; i<len - 1
{ for (int j = 0; j < len - i - 1; j++) //j = 0; j<len - j - 1
{
if (arr[j] > arr[j+1])
{
swap(&arr[j], &arr[j+1]);
}
}
}
}
void PrintArray(int arr[],int len)
{
for (int i = 0; i < len; i++)
{
printf("%d ",arr[i]);
}
printf("\n");
}
//选择排序
void SelectSort(int arr[],int len)
{
//选择排序是不是减少交换次数
for (int i = 0; i < len; i++)
{
int min = i;
for (int j = i + 1; j < len; j++)
{
if (arr[j] < arr[min])
{
min = j;
}
}
if (min != i)
{
swap(&arr[min], &arr[i]);
}
}
}
//插入排序
//基本有序的排列的情况下,效率是非常高的,或者元素的个数比较少的时候,效率也是比较高的
void InsertSort(int arr[], int len)
{
int j=0;
for (int i = 1; i < len; i++)
{
if (arr[i] < arr[i - 1])
{
int temp = arr[i];
for (int j = i - 1; j >= 0 && temp < arr[j]; j--)//两个判断条件
{
arr[j + 1] = arr[j];
}
arr[j + 1] = temp;
}
}
}
int main(void)
{
int arr[MAX];
srand((unsigned int)time(NULL));
for (int i = 0; i < MAX; i++)
{
arr[i] = rand() % MAX;
}
//冒泡排序
long tbubble_start = getSystemTime();
BubbleSort(arr,MAX);
long tbubble_end = getSystemTime();
printf("冒泡排序%d个元素,所需时间%ld\n",MAX, tbubble_end- tbubble_start);
//选择排序
long tselect_start = getSystemTime();
SelectSort(arr, MAX);
long tselect_end = getSystemTime();
printf("冒泡排序%d个元素,所需时间%ld\n", MAX, tselect_end - tselect_start);
printf("------------------------\n");;
//PrintArray(arr, MAX);
//InsertSort(arr, MAX);
srand((unsigned int)time(NULL));
for (int i = 0; i < MAX; i++)
{
arr[i] = rand() % MAX;
}
long tinsert_start = getSystemTime();
InsertSort(arr, MAX);
long tinsert_end = getSystemTime();
printf("冒泡排序%d个元素,所需时间%ld\n", MAX, tinsert_end - tinsert_start);
system("pause");
return 0;
}
如图可以看出来,各种排序的算法快慢!
对于插入排序,元素的序列基本有序的情况下
插入排序在数据量比较小的情况下,效果较好!
由此:可以思考
分组,插入排序
先分组 然后对每一组分别进行插入排序
希尔排序
核心代码:
//希尔排序
void ShellSort(int arr[], int len)
{
int i, j=0,k=0;
int increasement = len;
do {
//确定分组的增量
increasement = increasement / 3 + 1;
for (i = 0; i < increasement; i++)
{
for (j = i + increasement; j < len; j += increasement)
{
if (arr[j] < arr[j - increasement])
{
int temp = arr[j];
for (k = j - increasement; k >= 0 && temp < arr[k]; k -= increasement)
{
arr[k + increasement] = arr[k];
}
arr[k + increasement] = temp;
}
}
}
} while (increasement > 1);
}
完整代码如下:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<time.h>
#include<sys/timeb.h> //这个可以精确到毫秒
#define MAX 50000
//获取精确的时间函数
long getSystemTime()
{
struct timeb tb;
ftime(&tb);
return tb.time * 1000 + tb.millitm;
}
//交换函数
void swap(int *a, int *b)
{
int temp;
temp = *a;
*a = *b;
*b = temp;
}
//冒泡排序
void BubbleSort(int arr[],int len)
{
for (int i = 0; i < len - 1; i++)//i = 0; i<len - 1
{ for (int j = 0; j < len - i - 1; j++) //j = 0; j<len - j - 1
{
if (arr[j] > arr[j+1])
{
swap(&arr[j], &arr[j+1]);
}
}
}
}
void PrintArray(int arr[],int len)
{
for (int i = 0; i < len; i++)
{
printf("%d ",arr[i]);
}
printf("\n");
}
//选择排序
void SelectSort(int arr[],int len)
{
//选择排序是不是减少交换次数
for (int i = 0; i < len; i++)
{
int min = i;
for (int j = i + 1; j < len; j++)
{
if (arr[j] < arr[min])
{
min = j;
}
}
if (min != i)
{
swap(&arr[min], &arr[i]);
}
}
}
//插入排序
//基本有序的排列的情况下,效率是非常高的,或者元素的个数比较少的时候,效率也是比较高的
void InsertSort(int arr[], int len)
{
int j=0;
for (int i = 1; i < len; i++)
{
if (arr[i] < arr[i - 1])
{
int temp = arr[i];
for (int j = i - 1; j >= 0 && temp < arr[j]; j--)//两个判断条件
{
arr[j + 1] = arr[j];
}
arr[j + 1] = temp;
}
}
}
//希尔排序
void ShellSort(int arr[], int len)
{
int i, j=0,k=0;
int increasement = len;
do {
//确定分组的增量
increasement = increasement / 3 + 1;
for (i = 0; i < increasement; i++)
{
for (j = i + increasement; j < len; j += increasement)
{
if (arr[j] < arr[j - increasement])
{
int temp = arr[j];
for (k = j - increasement; k >= 0 && temp < arr[k]; k -= increasement)
{
arr[k + increasement] = arr[k];
}
arr[k + increasement] = temp;
}
}
}
} while (increasement > 1);
}
int main(void)
{
int arr[MAX];
srand((unsigned int)time(NULL));
for (int i = 0; i < MAX; i++)
{
arr[i] = rand() % MAX;
}
//冒泡排序
long tbubble_start = getSystemTime();
BubbleSort(arr,MAX);
long tbubble_end = getSystemTime();
printf("冒泡排序%d个元素,所需时间%ld\n",MAX, tbubble_end- tbubble_start);
//选择排序
long tselect_start = getSystemTime();
SelectSort(arr, MAX);
long tselect_end = getSystemTime();
printf("选择排序%d个元素,所需时间%ld\n", MAX, tselect_end - tselect_start);
printf("------------------------\n");
//PrintArray(arr, MAX);
//InsertSort(arr, MAX);
srand((unsigned int)time(NULL));
for (int i = 0; i < MAX; i++)
{
arr[i] = rand() % MAX;
}
long tinsert_start = getSystemTime();
InsertSort(arr, MAX);
long tinsert_end = getSystemTime();
printf("插入排序%d个元素,所需时间%ld\n", MAX, tinsert_end - tinsert_start);
printf("------------------------\n");
for (int i = 0; i < MAX; i++)
{
arr[i] = rand() % MAX;
}
long tShell_start = getSystemTime();
ShellSort(arr,MAX);
long eShell_end = getSystemTime();
printf("Shell排序%d个元素,所需时间%ld\n", MAX, eShell_end - tShell_start);
system("pause");
return 0;
}
以上排序完整代码:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<time.h>
#include<sys/timeb.h> //这个可以精确到毫秒
#define MAX 50000
//获取精确的时间函数
long getSystemTime()
{
struct timeb tb;
ftime(&tb);
return tb.time * 1000 + tb.millitm;
}
//交换函数
void swap(int *a, int *b)
{
int temp;
temp = *a;
*a = *b;
*b = temp;
}
//冒泡排序
void BubbleSort(int arr[],int len)
{
for (int i = 0; i < len - 1; i++)//i = 0; i<len - 1
{ for (int j = 0; j < len - i - 1; j++) //j = 0; j<len - j - 1
{
if (arr[j] > arr[j+1])
{
swap(&arr[j], &arr[j+1]);
}
}
}
}
void PrintArray(int arr[],int len)
{
for (int i = 0; i < len; i++)
{
printf("%d ",arr[i]);
}
printf("\n");
}
//选择排序
void SelectSort(int arr[],int len)
{
//选择排序是不是减少交换次数
for (int i = 0; i < len; i++)
{
int min = i;
for (int j = i + 1; j < len; j++)
{
if (arr[j] < arr[min])
{
min = j;
}
}
if (min != i)
{
swap(&arr[min], &arr[i]);
}
}
}
//插入排序
//基本有序的排列的情况下,效率是非常高的,或者元素的个数比较少的时候,效率也是比较高的
void InsertSort(int arr[], int len)
{
int j=0;
for (int i = 1; i < len; i++)
{
if (arr[i] < arr[i - 1])
{
int temp = arr[i];
for (int j = i - 1; j >= 0 && temp < arr[j]; j--)//两个判断条件
{
arr[j + 1] = arr[j];
}
arr[j + 1] = temp;
}
}
}
//希尔排序
void ShellSort(int arr[], int len)
{
int i, j=0,k=0;
int increasement = len;
do {
//确定分组的增量
increasement = increasement / 3 + 1;
for (i = 0; i < increasement; i++)
{
for (j = i + increasement; j < len; j += increasement)
{
if (arr[j] < arr[j - increasement])
{
int temp = arr[j];
for (k = j - increasement; k >= 0 && temp < arr[k]; k -= increasement)
{
arr[k + increasement] = arr[k];
}
arr[k + increasement] = temp;
}
}
}
} while (increasement > 1);
}
int main(void)
{
int arr[MAX];
srand((unsigned int)time(NULL));
for (int i = 0; i < MAX; i++)
{
arr[i] = rand() % MAX;
}
//冒泡排序
long tbubble_start = getSystemTime();
BubbleSort(arr,MAX);
long tbubble_end = getSystemTime();
printf("冒泡排序%d个元素,所需时间%ld\n",MAX, tbubble_end- tbubble_start);
//选择排序
long tselect_start = getSystemTime();
SelectSort(arr, MAX);
long tselect_end = getSystemTime();
printf("选择排序%d个元素,所需时间%ld\n", MAX, tselect_end - tselect_start);
printf("------------------------\n");
//PrintArray(arr, MAX);
//InsertSort(arr, MAX);
srand((unsigned int)time(NULL));
for (int i = 0; i < MAX; i++)
{
arr[i] = rand() % MAX;
}
long tinsert_start = getSystemTime();
InsertSort(arr, MAX);
long tinsert_end = getSystemTime();
printf("插入排序%d个元素,所需时间%ld\n", MAX, tinsert_end - tinsert_start);
printf("------------------------\n");
for (int i = 0; i < MAX; i++)
{
arr[i] = rand() % MAX;
}
long tShell_start = getSystemTime();
ShellSort(arr,MAX);
long eShell_end = getSystemTime();
printf("Shell排序%d个元素,所需时间%ld\n", MAX, eShell_end - tShell_start);
system("pause");
return 0;
}
(完!)