目录
排序的基本概念
1、排序
是指把一组数据以某种关系(递增或递减)按顺序排列起来的一种算法。
例如:
数列18、3、5、6、2、9、1、0、4、7
递增排序后 0、1、2、3、4、5、6、7、8、9
递减排序后9、8、7、6、5、4、3、2、1、0
2、排序的稳定性
如果在一组需要排序的数据序列中,数据ki和kj的值相同,即ki==kj,且在排序前ki在序列中的位置领
先于kj,那么当排序后,如果ki和kj的相对前后次序保持不变,即ki仍然领先于kj,则称此类排序算法
是稳定的。如果ki和kj的相对前后次序变,即kj领先于ki了,则称此类排序算法是不稳定的。
3、排序的过程
排序的过程中需要进行如下两种基本操作:
比较两个数据的大小
移动两个数据的位置
4、排序算法
我们比较常用的排序算法有:冒泡排序、插入排序、选择排序、希尔排序(缩小增量排序)、快速排序、堆排序、归并排序
一、冒泡排序
代码示例:
cpp
#include<stdio.h>
void bubblesSort(int *arr,int len)
{
for (int i = 0; i < len - 1; i++)
{
for (int j = 0; j < len - 1 - i; j++)
{
if (arr[j] > arr[j + 1])
{
//交换两个值
int temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
}
}
}
}
//冒泡排序
int main()
{
int arr[10] = { 5,9,4,2,3,7,6,8,0,1 };
bubblesSort(arr, 10);
for (int i = 0; i < 10; i++)
printf("%d ", arr[i]);
getchar();
getchar();
return 0;
}
二、选择排序
代码示例:
cpp
#include<stdio.h>
void selectSort(int *arr,int len)
{
for (int i = 0; i < len - 1; i++)
{
int max = i;
for (int j = i; j < len; j++)
{
if (arr[max] < arr[j])
max = j;
}
//交换两个值
int temp = arr[i];
arr[i] = arr[max];
arr[max] = temp;
}
}
//选择排序
int main()
{
int arr[10] = { 5,9,4,2,3,7,6,8,0,1 };
selectSort(arr, 10);
for (int i = 0; i < 10; i++)
printf("%d ", arr[i]);
getchar();
getchar();
return 0;
}
三、顺序查找
代码示例:
cpp
#include<stdio.h>
int find(int *arr,int len,int value)
{
//顺序查找:从头遍历到尾,一个一个的查找过去
int index = -1; //默认没找到
for (int i = 0; i < len; i++)
{
if (arr[i] == value)
{
index = i;
break;
}
}
return index;
}
//顺序查找
int main()
{
srand(time(NULL)); //随机数种子
int arr[1000] = { 0 };
for (int i = 0; i < 1000; i++)
{
arr[i] = rand() % 200; // %N 范围:0~(N-1)
}
int index = find(arr, 100, 123);
printf("%d", index);
getchar();
getchar();
return 0;
}
四、二分查找
代码示例:
cpp
#include<stdio.h>
void bubblesSort(int *arr,int len)
{
for (int i = 0; i < len - 1; i++)
{
for (int j = 0; j < len - 1 - i; j++)
{
if (arr[j] > arr[j + 1])
{
//交换两个值
int temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
}
}
}
}
int binary_search(int*arr,int len,int vlaue)
{
int left = 0;
int rigth = len - 1;
while (left <= rigth)
{
int mid = (left + rigth) / 2; //中间下标
if (arr[mid] == vlaue)
{
return mid;
}
if (vlaue > arr[mid])
left = mid + 1;
if (vlaue < arr[mid])
rigth = mid - 1;
}
return -1;
}
//二分查找
int main()
{
srand(time(NULL)); //随机数种子
int arr[100] = { 0 };
for (int i = 0; i < 100; i++)
{
arr[i] = rand() % 200; // %N 范围:0~(N-1)
}
bubblesSort(arr, 100); //使用二分查找,一定是有序的内容才能二分查找
int index = binary_search(arr, 100, 123);
printf("%d", index);
getchar();
getchar();
return 0;
}