最近马上就要校招了,开始进入刷题模式,做了一些题后发现,排序算法实际上是好多题目的基础,掌握好各种排序算法对处理各种复杂题目是十分有帮助的。
好了,话不多说,概念大家都懂,我直接上代码,以下代码我全部手敲了一遍,建议大家也自己敲一遍,再比较一下各种算法的异同。
先列个表总结一下:
冒泡排序:
#include <iostream>
using namespace std;
void swap(int *a, int *b){
int c;
c = *a;
*a = *b;
*b = c;
}
int main(){
int num[10];
int i,j;
//初始化数组为10 9 8 7 6 5 4 3 2 1
for (i = 0; i < 10; i++){
num[i] = 10 - i;
}
//排序,从a[0]开始排,从小到大
for (i = 0; i < 10; i++){
for (j = i + 1; j < 10; j++){
if (num[i] > num[j]){
swap(&num[i], &num[j]);
}
}
}
for (i = 0; i < 10; i++)
cout<<num[i]<<endl;
return 0;
}
堆排序:
#include <iostream>
#include <algorithm>
using namespace std;
void HeapAdjust(int *a,int i,int size) //调整堆
{
int lchild=2*i; //i的左孩子节点序号
int rchild=2*i+1; //i的右孩子节点序号
int max=i; //临时变量
if(i<=size/2) //如果i是叶节点就不用进行调整
{
if(lchild<=size&&a[lchild]>a[max])
{
max=lchild;
}
if(rchild<=size&&a[rchild]>a[max])
{
max=rchild;
}
if(max!=i)
{
swap(a[i],a[max]);
HeapAdjust(a,max,size); //避免调整之后以max为父节点的子树不是堆
}
}
}
void swap(int* a,int* b){
int* temp;
temp=a;
a=b;
b=temp;
}
void BuildHeap(int *a,int size) //建立堆
{
int i;
for(i=size/2;i>=1;i--) //非叶节点最大序号值为size/2
{
HeapAdjust(a,i,size);
}
}
void HeapSort(int *a,int size) //堆排序
{
int i;
BuildHeap(a,size);
for(i=size;i>=1;i--)
{
//cout<<a[1]<<" ";
swap(a[1],a[i]); //交换堆顶和最后一个元素,即每次将剩余元素中的最大者放到最后面
//BuildHeap(a,i-1); //将余下元素重新建立为大顶堆
HeapAdjust(a,1,i-1); //重新调整堆顶节点成为大顶堆
}
}
int main(int argc, char *argv[])
{
//int a[]={0,16,20,3,11,17,8};
int a[100];
int size;
cin>>size;
if(size>0)
{
int i;
for(i=1;i<=size;i++)
cin>>a[i];
HeapSort(a,size);
for(i=1;i<=size;i++)
cout<<a[i]<<" ";
cout<<endl;
}
return 0;
}
插入排序:
#include<iostream>
#include<algorithm>
using namespace std;
void insertsort(int* a,int size){
int key;
int i,j;
for(j=2;j<=size;j++){
i=j-1;
key=a[j];
while(i>0&&a[i]>key){
a[j]=a[i];
i=i-1;
}
a[i+1]=key;
}
}
int main(int argc,char* argv[]){
int a[100];
int size;
cin>>size;
if(size>0)
{
int i;
for(i=1;i<=size;i++)
cin>>a[i];
insertsort(a,size);
for(i=1;i<=size;i++)
cout<<a[i]<<" ";
cout<<endl;
}
return 0;
}
快速排序:
#include<iostream>
using namespace std;
/* Quick Sort */
void swap(int& a,int& b){
int temp;
temp = a;
a = b;
b = temp;
}
int partition(int* a,int p,int q){
int i = p-1;
int j;
for(j=p;j<q;j++){
if(a[j]<=a[q]){
i++;
swap(a[i],a[j]);
}
}
swap(a[i+1],a[q]);
return i+1;
}
void quicksort(int* a,int p,int q){
int r;
if(p<q){
r = partition(a,p,q);
quicksort(a,p,r-1);
quicksort(a,r+1,q);
}
}
int main(){
int array[100];
int size;
int i;
cout<<"please input the size:"<<endl;
cin>>size;
cout<<"please input the array:"<<endl;
for(i=0;i<size;i++)
cin>>array[i];
quicksort(array,0,size-1);
cout<<"sorted array:"<<endl;
for(i=0;i<size;i++)
cout<<array[i]<<" ";
return 0;
}
归并排序:
#include<iostream>
using namespace std;
#define MAX_NUM 99999
#define Length 10
void Merge(int* arr,int p,int q,int r)
{
int n1 = q - p + 1;
int n2 = r - q;
int i,j,k;
int* tmp1 = new int[n1+1];
int* tmp2 = new int[n2+1];
for(i=0;i<n1;i++)
tmp1[i] = arr[p+i];
for(j=0;j<n2;j++)
tmp2[j] = arr[q+j+1];
tmp1[n1] = tmp2[n2] = MAX_NUM;
i = j = 0;
for(k=p;k<=r;k++)
{
if(tmp1[i]<=tmp2[j])
{
arr[k] = tmp1[i];
i++;
}
else
{
arr[k] = tmp2[j];
j++;
}
}
delete tmp1;
delete tmp2;
}
void Merge_Sort(int* arr,int p,int r)
{
if(p < r)
{
int q = (p+r)/2;
Merge_Sort(arr,p,q);
Merge_Sort(arr,q+1,r);
Merge(arr,p,q,r);
}
}
int main(){
int* arr = new int[Length];
cout<< "input 10 data of arr"<<endl;
for(int i=0;i<Length;i++)
cin>>arr[i];
Merge_Sort(arr,0,Length-1);
for(int i=0;i<Length;i++)
cout<<i<<": "<<arr[i]<<endl;
return 0;
}