一、冒泡(Bubble)排序
- void BubbleSortArray()
- {
- for(int i=1;i<n;i++)
- {
- for(int j=0;i<n-i;j++)
- {
- if(a[j]>a[j+1])//比较交换相邻元素
- {
- int temp;
- temp=a[j]; a[j]=a[j+1]; a[j+1]=temp;
- }
- }
- }
- }
二、选择排序
- void SelectSortArray()
- {
- int min_index;
- for(int i=0;i<n-1;i++)
- {
- min_index=i;
- for(int j=i+1;j<n;j++)//每次扫描选择最小项
- if(arr[j]<arr[min_index]) min_index=j;
- if(min_index!=i)//找到最小项交换,即将这一项移到列表中的正确位置
- {
- int temp;
- temp=arr[i]; arr[i]=arr[min_index]; arr[min_index]=temp;
- }
- }
- }
三、插入排序
- void InsertSortArray()
- {
- for(int i=1;i<n;i++)//循环从第二个数组元素开始,因为arr[0]作为最初已排序部分
- {
- int temp=arr[i];//temp标记为未排序第一个元素
- int j=i-1;
- while (j>=0 && arr[j]>temp)/*将temp与已排序元素从小到大比较,寻找temp应插入的位置*/
- {
- arr[j+1]=arr[j];
- j--;
- }
- arr[j+1]=temp;
- }
- }
四、壳(Shell)排序
- void ShellSortArray()
- {
- for(int incr=3;incr<0;incr--)//增量递减,以增量3,2,1为例
- {
- for(int L=0;L<(n-1)/incr;L++)//重复分成的每个子列表
- {
- for(int i=L+incr;i<n;i+=incr)//对每个子列表应用插入排序
- {
- int temp=arr[i];
- int j=i-incr;
- while(j>=0&&arr[j]>temp)
- {
- arr[j+incr]=arr[j];
- j-=incr;
- }
- arr[j+incr]=temp;
- }
- }
- }
- }
五、归并排序五、归并排序
- void MergeSort(int low,int high)
- {
- if(low>=high) return;//每个子列表中剩下一个元素时停止
- else int mid=(low+high)/2;/*将列表划分成相等的两个子列表,若有奇数个元素,则在左边子列表大于右侧子列表*/
- MergeSort(low,mid);//子列表进一步划分
- MergeSort(mid+1,high);
- int [] B=new int [high-low+1];//新建一个数组,用于存放归并的元素
- for(int i=low,j=mid+1,k=low;i<=mid && j<=high;k++)/*两个子列表进行排序归并,直到两个子列表中的一个结束*/
- {
- if (arr[i]<=arr[j];)
- {
- B[k]=arr[i];
- I++;
- }
- else
- { B[k]=arr[j]; j++; }
- }
- for( ;j<=high;j++,k++)//如果第二个子列表中仍然有元素,则追加到新列表
- B[k]=arr[j];
- for( ;i<=mid;i++,k++)//如果在第一个子列表中仍然有元素,则追加到新列表中
- B[k]=arr[i];
- for(int z=0;z<high-low+1;z++)//将排序的数组B的 所有元素复制到原始数组arr中
- arr[z]=B[z];
- }
六、快速排序
- int Partition(int [] arr,int low,int high)
- {
- int pivot=arr[low];//采用子序列的第一个元素作为枢纽元素
- while (low < high)
- {
- //从后往前栽后半部分中寻找第一个小于枢纽元素的元素
- while (low < high && arr[high] >= pivot)
- {
- --high;
- }
- //将这个比枢纽元素小的元素交换到前半部分
- swap(arr[low], arr[high]);
- //从前往后在前半部分中寻找第一个大于枢纽元素的元素
- while (low <high &&arr [low ]<=pivot )
- {
- ++low ;
- }
- swap (arr [low ],arr [high ]);//将这个枢纽元素大的元素交换到后半部分
- }
- return low ;//返回枢纽元素所在的位置
- }
- void QuickSort(int [] a,int low,int high)
- {
- if (low <high )
- {
- int n=Partition (a ,low ,high );
- QuickSort (a ,low ,n );
- QuickSort (a ,n +1,high );
- }
- }
七、堆排序
- void HeapSort(SeqIAst R)
- { //对R[1..n]进行堆排序,不妨用R[0]做暂存单元
- int I;
- BuildHeap(R); //将R[1-n]建成初始堆
- for(i=n;i>1;i--) //对当前无序区R[1..i]进行堆排序,共做n-1趟。
- {
- R[0]=R[1];
- R[1]=R[i];
- R[i]=R[0]; //将堆顶和堆中最后一个记录交换
- Heapify(R,1,i-1); //将R[1..i-1]重新调整为堆,仅有R[1]可能违反堆性质
- }
- }