排序方法(冒泡、选择、插入、快速、希尔、桶排序、归并)

一、冒泡排序
冒泡排序:数列中两两比较,较大数往后移位

void fun1(int arr[],int n)
{
	for (int i = 0; i < n - 1; i++)
	{
		for (int j = 0; j < n - i - 1; j++)
		{
			if (arr[j]>arr[j + 1])//相邻两个数进行比较,较大的一个往后移位
			{
				int temp = arr[j];
				arr[j] = arr[j + 1];
				arr[j + 1] = temp;
			}
		}
	}
}

二、选择排序
选择排序:每一轮找出最小的数出来,将其放置前位,一直到结束

void fun2(int arr[], int n)
{
	for (int i = 0; i < n-1; i++)
	{
		int temp = i;//将下标为i的元素暂时标记为最小值
		for (int j = i + 1; j < n; j++)
		{
			if (arr[j] < arr[temp])
			{
				temp = j;//与后比较,如果比原标记更小,标记更新
			}
		}
		int m = arr[temp];//将最小值前置
		arr[temp] = arr[i];
		arr[i] = m;
	}
}

三、插入排序
插入排序:将数列中的某元素插入至有序数列中,直至前元素比某元素小,从而位置定

 void fun3(int arr[], int n)
    {
    	for (int i = 1; i < n; i++)
    	{
    		int temp = arr[i],j=i-1;//temp标记需要插入元素
    		for (j; j >= 0; j--)
    		{
    			if (arr[j]>temp)//将前元素与标记元素比较,如果前元素比标记元素大,则前元素往后移位
    			{
    				arr[j + 1] = arr[j];
    			}
    			else break;//如果前元素比标记元素小,则跳出
    		}
    		arr[j + 1] = temp;
    	}
    }

四、快速排序
快速排序:
1 左边找比首元素大的,右边找比首元素小的
2 交换位置
3 将首元素放置至中心,作为中心轴
4 中心轴前面的元素从步骤1再次开始查找
5 中心轴后面的元素也从步骤1再次开始查找

void fun4(int arr[], int left, int right)
{
	if (left >= right)return 0;//如果元素只有一个或者左针移位到右针右边,则结束
	int i = left, j = right, temp;
	while (i < j)
	{
		while (i < j&&arr[left] < arr[j])//从右边开始查找比首元素小的
			j--;
		while (i < j&&arr[left] >= arr[i])//从左边开始查找比首元素大的
			i++;
		if (i < j)
		{
			temp = arr[j];//如果 一左一右,则交换位置
			arr[j] = arr[i];
			arr[i] = temp;
		}
	}
	temp = arr[left];//将首元素放置在中心位置
	arr[left] = arr[i];
	arr[i] = temp;
	fun4(arr, left, i - 1);//中心轴左边的元素递归进行上述查找
	fun4(arr, j + 1, right);//中心轴右边的元素递归进行上述查找
}

五、希尔排序
希尔排序是对插入排序的优化
排序规则:
1、首先初始化数组,假设数组的元素个数为10;
在这里插入图片描述
2、将数组分为N\2个子数组,即10/2=5个子数组
在这里插入图片描述
将数组分为5个子数组,(6,7)、(8,5)、(1,10)、(2,9)、(4,3)
对每个子数组使用插入排序进行排序,变成(6,7)、(5,8)、(1,10)、(2,9)、(3,4)
在这里插入图片描述
3、将数组分为N\2个子数组,即5/2=2个子数组
在这里插入图片描述
将数组分为2个子数组,(6,1,3,8,9)、(5,2,7,10,4)
对每个子数组使用插入排序进行排序,变成(1,3,6,8,9)、(2,4,5,7,10)
在这里插入图片描述
4、将数组分为N\2个子数组,即2/2=1个子数组
对子数组使用插入排序进行排序

在这里插入图片描述
具体实现代码:

#include<iostream>
using std::cin;
using std::endl;
using std::cout;
void shell_sort(int arr[],int len)
{
int j;
int tempVal;
int jump=len>>1;//N/2
while(jump>0)
{
for(int i=jump;i<len;++i)
{
tempVal=arr[i];
for(j=i-jump;j>=0&&tempVal<arr[j];j-=jump)
{
arr[j+jump]=arr[j];
}
arr[j+jump]=tempVal;
}
jump>>=1;
}
}
int main()
{
int arr[10]={6,8,1,2,4,7,5,10,9,3};
shell_sort(arr,10);
for(int i=0;i<10;++i)
{
cout<<arr[i]<<" ";
}
cout<<endl;
cin.get();
return 0;
}

六、桶排序
桶排序:将一系列元素放入定义好的数组中,在数组中就将顺序排列好,桶元素只针对于整数排序
用空间来换取效率的一种排序规则
代码实现:

 #include<iostream>
    using std::cin;
    using std::endl;
    using std::cout;
    #define N 11
  
    void bucket_sort(int arr[], int len)
{
 int temp[10][N] = { };
 int tempIndex;
 for (int n = 1; n < 1000; n *= 10)
 {
  for (int x = 0; x < 10; ++x)
  {
   for (int y = 0; y < N; ++y)
   {
    temp[x][y] = -1;//给二维数组赋初值,全部赋为-1,只要是不在序列中出现的数组即可
   }
  }
  for (int i = 0; i < len; ++i)
  {
   tempIndex = (arr[i] / n) % 10;//取到序列中的元素的个位/百位/.....的数字
   temp[tempIndex][i] = arr[i];//根据个位/百位/.....的数字确定容器
  }
  int j = 0;
  for (int x = 0; x < 10; ++x)
  {
   for (int y = 0; y < N; ++y)
   {
    if (temp[x][y] != -1)
    {
     arr[j] = temp[x][y];//将容器中数据放回原数组中去
     j++;
    }
   }
  }
 }
}
int main()
{
 int array[N] = { 6,8,1,500,4,7,500,10,9,3 ,999};
 bucket_sort(array, N);
 for (int i = 0; i < 10; ++i)
 {
  cout << array[i] << " ";
 }
 cout << endl;
 cin.get();
 return 0;
}

七、归并排序
归并排序:采用分而治之的思想对序列进行排序
1、将一组序列采用递归将其分到不能够再分为止
2、将不可分序列合并排序
代码实现:

#include<iostream>
using std::cin;
using std::endl;
using std::cout;
#define N 10
void _merge_in_arr(int arr[],int left,int mid,int right)//将序列合并并排序
{
int length=right-left+1;
int *pData=new int[length];
memset(pData,0,sizeof(int)*length);

int low=left;
int hig=mid+1;
int index=0;
while(low<=mid&&hig<=right)
{
while(low<=mid&&arr[low]<=arr[hig])
pData[index++]=arr[low++];
while(hig<=right&&arr[hig]<arr[low])
pData[index++]=arr[hig++];
}
if(low<=mid)
memcpy(&pData[index],&arr[low],sizeof(int) * (mid-low+1));
if(hig<=right)
memcpy(&pData[index],&arr[hig],sizeof(int) * (right-hig+1));
memcpy(&arr[left],pData,sizeof(int)*length);
}

void _merge(int arr[],int left,int right)//将序列拆分到不可再分为止
{
if(left>=right)return;
int mid=((right-left)>>1)+left;
_merge(arr,left,mid);
_merge(arr,mid+1,right);
_merge_in_arr(arr,left,mid,right);
}

void _merge(int arr[],int len)
{
_merge(arr,0,len-1);
}

int main()
{
int array[N]={9,8,1,5,3,2,1,5,3,1};
_merge(array,N);
for(int i=0;i<N;++i)
{
cout<<array[i]<<" ";
}
cout<<endl;
cin.get();
return 0;
}
好的,以下是C语言实现各种排序方法的代码示例: 1. 冒泡排序 ``` c void bubble_sort(int arr[], int n) { for (int i = 0; i < n - 1; i++) { for (int j = 0; j < n - i - 1; j++) { if (arr[j] > arr[j + 1]) { int temp = arr[j]; arr[j] = arr[j + 1]; arr[j + 1] = temp; } } } } ``` 2. 选择排序 ``` c void selection_sort(int arr[], int n) { for (int i = 0; i < n - 1; i++) { int min_index = i; for (int j = i + 1; j < n; j++) { if (arr[j] < arr[min_index]) { min_index = j; } } int temp = arr[i]; arr[i] = arr[min_index]; arr[min_index] = temp; } } ``` 3. 插入排序 ``` c void insertion_sort(int arr[], int n) { for (int i = 1; i < n; i++) { int key = arr[i]; int j = i - 1; while (j >= 0 && arr[j] > key) { arr[j + 1] = arr[j]; j--; } arr[j + 1] = key; } } ``` 4. 希尔排序 ``` c void shell_sort(int arr[], int n) { for (int gap = n / 2; gap > 0; gap /= 2) { for (int i = gap; i < n; i++) { int temp = arr[i]; int j; for (j = i; j >= gap && arr[j - gap] > temp; j -= gap) { arr[j] = arr[j - gap]; } arr[j] = temp; } } } ``` 5. 快速排序 ``` c void quick_sort(int arr[], int left, int right) { if (left < right) { int pivot = partition(arr, left, right); quick_sort(arr, left, pivot - 1); quick_sort(arr, pivot + 1, right); } } int partition(int arr[], int left, int right) { int pivot = arr[right]; int i = left - 1; for (int j = left; j < right; j++) { if (arr[j] < pivot) { i++; int temp = arr[i]; arr[i] = arr[j]; arr[j] = temp; } } int temp = arr[i + 1]; arr[i + 1] = arr[right]; arr[right] = temp; return i + 1; } ``` 6. 归并排序 ``` c void merge_sort(int arr[], int left, int right) { if (left < right) { int mid = left + (right - left) / 2; merge_sort(arr, left, mid); merge_sort(arr, mid + 1, right); merge(arr, left, mid, right); } } void merge(int arr[], int left, int mid, int right) { int i = left, j = mid + 1, k = 0; int temp[right - left + 1]; while (i <= mid && j <= right) { if (arr[i] < arr[j]) { temp[k++] = arr[i++]; } else { temp[k++] = arr[j++]; } } while (i <= mid) { temp[k++] = arr[i++]; } while (j <= right) { temp[k++] = arr[j++]; } for (int m = left, n = 0; m <= right; m++, n++) { arr[m] = temp[n]; } } ``` 7. 堆排序 ``` c void heap_sort(int arr[], int n) { for (int i = n / 2 - 1; i >= 0; i--) { heapify(arr, n, i); } for (int i = n - 1; i > 0; i--) { int temp = arr[0]; arr[0] = arr[i]; arr[i] = temp; heapify(arr, i, 0); } } void heapify(int arr[], int n, int i) { int largest = i; int left = 2 * i + 1; int right = 2 * i + 2; if (left < n && arr[left] > arr[largest]) { largest = left; } if (right < n && arr[right] > arr[largest]) { largest = right; } if (largest != i) { int temp = arr[i]; arr[i] = arr[largest]; arr[largest] = temp; heapify(arr, n, largest); } } ``` 8. 计数排序 ``` c void counting_sort(int arr[], int n) { int max = arr[0], min = arr[0]; for (int i = 1; i < n; i++) { if (arr[i] > max) { max = arr[i]; } if (arr[i] < min) { min = arr[i]; } } int count[max - min + 1]; memset(count, 0, sizeof(count)); for (int i = 0; i < n; i++) { count[arr[i] - min]++; } for (int i = 1; i < max - min + 1; i++) { count[i] += count[i - 1]; } int temp[n]; for (int i = n - 1; i >= 0; i--) { temp[--count[arr[i] - min]] = arr[i]; } for (int i = 0; i < n; i++) { arr[i] = temp[i]; } } ``` 9. 桶排序 ``` c void bucket_sort(int arr[], int n) { int max = arr[0], min = arr[0]; for (int i = 1; i < n; i++) { if (arr[i] > max) { max = arr[i]; } if (arr[i] < min) { min = arr[i]; } } int bucket_num = (max - min) / n + 1; int bucket[bucket_num][n]; int bucket_count[bucket_num]; memset(bucket_count, 0, sizeof(bucket_count)); for (int i = 0; i < n; i++) { int index = (arr[i] - min) / n; bucket[index][bucket_count[index]] = arr[i]; bucket_count[index]++; } int k = 0; for (int i = 0; i < bucket_num; i++) { if (bucket_count[i] > 0) { insertion_sort(bucket[i], bucket_count[i]); for (int j = 0; j < bucket_count[i]; j++) { arr[k++] = bucket[i][j]; } } } } ``` 10. 基数排序 ``` c void radix_sort(int arr[], int n) { int max = arr[0]; for (int i = 1; i < n; i++) { if (arr[i] > max) { max = arr[i]; } } for (int exp = 1; max / exp > 0; exp *= 10) { counting_sort_by_digit(arr, n, exp); } } void counting_sort_by_digit(int arr[], int n, int exp) { int count[10]; memset(count, 0, sizeof(count)); for (int i = 0; i < n; i++) { count[(arr[i] / exp) % 10]++; } for (int i = 1; i < 10; i++) { count[i] += count[i - 1]; } int temp[n]; for (int i = n - 1; i >= 0; i--) { temp[--count[(arr[i] / exp) % 10]] = arr[i]; } for (int i = 0; i < n; i++) { arr[i] = temp[i]; } } ``` 以上是C语言实现各种排序方法的代码示例,可以根据具体的需求进行选择
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值